IT铁人DAY 23-Command 命令模式

  今天要学习的是Command Pattern,我个人觉得它的实用性蛮高的,也觉得它很好理解,如果有实作过一堆按钮的表单,就会觉得它非常好用。


问题情境与解析

  通常一个表单上至少有一个按钮,可能是清除所有文字框的内容,或是要取消填写表单,送出表单等等,在最初的程序可能会将所有的按钮都创建一个类别,并封装其所需要的资讯,来完成按钮的功能,这看起来似乎没什麽问题。

  不过後来发现,某些功能的程序一直重复出现在不同的类别,换句话说,不同的按钮实现了相同的功能,不一样的地方可能只有细微的变化,这样的设计感觉有点问题。

  而命令模式会将所有与需求相关的资讯(包括作用的物件、方法名称等等)传达给一个单独的命令类别,而不同的命令类别会实作一个相同的介面,而这个介面就可以让发送者不必耦合各个具体的命令类别。如此一来,所有的按钮功能都会在不同的命令类别实现,也因为这样,就不会有重复的程序码出现。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211008/20140743GnuUqq11Fz.png

Skeleton Code

interface Command {
    public void execute();
}

class ConcreteCommand implements Command {
    private Receiver receiver;
		private Params params;
    
    public ConcreteCommand(Receiver r, Params p) {
        this.receiver = r;
        this.params = p;
    }
    
    public void execute() {
        receiver.operation(params);
    }
}

class Receiver {
    public void operation(Params p) {
        // do something
    }
}

class Invoker {
    private Command command;
    
    public void setCommand(Command c) {
        this.command = c;
    }
    
    public void executeCommand() {
        command.execute();
    }
}

  使用命令模式,可以不用更改我们现有的程序就可以添加新的命令,使程序扩展非常方便,而且也减少了调用者与接收者之间的耦合,甚至可以将一组简单的命令组合成一个复杂的命令,使用的弹性非常高。若是想要实现一个低耦合的设计,不想让客户端程序有太多可避免的资讯,就可以使用命令模式来帮助我们做到这点。


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  Day23-Vuex核心概念与结构(part1)

>>:  Day 23 K-平均演算法 K-Means

Day 16 wireframe 黑白线稿 ( 细节精修+填入资讯 )

来找设计师一起 side project,前後端 / UIUX 皆可ㄛ。配对单连结: https:...

DAY28-如何与人协同工作与好好沟通-外国人篇

笔者本人的英文程度可以说是台湾教育典型的英文程度,可是说是好又很不好。 所谓的好又很不好听起来是一种...

[Day 28] 利用CreateML训练的模型判断情绪(上)

经过这两篇CreateML建立机器学习模型与如何提升判断准确度的教学相信大家都学会了该如何制作Cr...

企划实现(11)

FB登入 以上功能都完成後就要开始环境的建置了 第一步:下载android studio sdk(如...

Day7-在认识 useMemo 前,先认识 React.memo

今天介绍的是避免重新渲染的 HOC(Higher Order Component) React.me...