设计模式(8)-命令模式详解(易懂)

2018-02-11 14:14:08来源:https://www.jianshu.com/p/7d190a1c8823作者:安卓干货铺人点击

分享


命令模式的定义

命令模式,将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)。


模型:




image

Invoker:调用者,就是接收到命令后负责调用


Receiver:接受者,也就是执行命令的人,最苦逼的


Command:命令者,封装好的命令类


下面通过通俗的实例来了解一下命令模式。


实例说明

既然命令,就拿“项目经理”-“开发人员”举例吧,比如有个外包的项目需要开发,开发完成后甲方要求改一改某个功能。下面用代码详细说明一下:


1.首先定义一个抽象的Receiver,因为开发人员不止一个人



public abstract class AbstractReceiver {
//写项目
public abstract void write();
//增删改项目
public abstract void change();
//提交程序
public abstract void ubmit();
}

2.定义具体的Receiver,这里假设有两个开发人员


public class ReceiverA extends  AbstractReceiver{
@Override
public void write() {
Log.d("qzs","写代码");
}
@Override
public void change() {
Log.d("qzs","改需求");
}
@Override
public void submit() {
Log.d("qzs","提交");
}
}


public class ReceiverB extends AbstractReceiver {
@Override
public void write() {
Log.d("qzs","写代码");
}
@Override
public void change() {
Log.d("qzs","改需求");
}
@Override
public void submit() {
Log.d("qzs","提交");
}
}

3.定义Command,命令类,也就是刚才说的甲方要求改一改某个功能的命令,假如此功能是开发人员A改:



public abstract class AbstractCommand {
ReceiverA receiverA=new ReceiverA(); //开发人员A
ReceiverB receiverB=new ReceiverB(); //开发人员B
//执行
public abstract void excute();
}


public class ChangeFunctionCommand extends AbstractCommand {
@Override
public void excute() {
receiverA.change();
receiverA.submit();
}
}

4.定义Invoker类,也就是项目经理,负责安排调用



public class Invoker {
private AbstractCommand command;
//设置命令
public void setCommand(AbstractCommand command) {
this.command = command;
}
// 执行命令
public void Action(){
command.excute();
}

5.调用



//定义一个项目经理-张三
Invoker ZHANGSAN=new Invoker();
//定义修改功能的命令并执行
AbstractCommand command=new ChangeFunctionCommand();
ZHANGSAN.setCommand(command);
ZHANGSAN.Action();

运行后:




image

命令模式的优缺点及其他

1.优点:


降低对象之间的耦合度


新的命令可以很容易地加入到系统中


可以比较容易地设计一个组合命令


调用同一方法实现不同的功能


2.缺点:


使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。


3.使用场景:


需要对行为进行记录,撤销,重做,事务处理时


需要抽象出待执行的动作,然后以参数的形式提供出来


4.附加:


如果有人问了,撤销的操作怎么做,其实很简单。在抽象的接收类中定义一个“撤销”的方法。然后再定义一个撤销Command来增加这个撤销命令就好了。


本文学习参考了《设计模式之禅》以及网上信息...


另外可以加入我的Android技术交流群:458739310
大家可以关注我的微信公众号:「安卓干货铺」一个有质量、有态度的公众号!












最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台