设计模式——命令模式

引言

网上有很多介绍设计模式系列的优秀文章,看懂不一定是真懂,能写出来,说出个1、2、3点才算是真的懂了,如果能灵活的应用到工作中才算是真的熟练。

1、模式场景

电视机遥控器,按开、关键就可以控制电视的开启和关闭。

2、模式结构

设计模式——命令模式_第1张图片

  • Command: 抽象命令类(模拟场景中开、关键命令抽象类)
  • ConcreteCommand: 具体命令类(模拟场景中的开、关命令)
  • Invoker: 调用者(模拟场景中的遥控器)
  • Receiver: 接收者(模拟场景中的电视机)

3、示例代码

3.1、抽象命令类

public abstract class AbstractCommand {
    public void execute() throws Exception {
        throw new Exception("请选择具体的命令");
    }
}

3.2、具体命令类

public class OpenCommand extends AbstractCommand {

    private Televatin televatin;

    public void setTelevatin(Televatin televatin) {
        this.televatin = televatin;
    }

    @Override
    public void execute(){
        televatin.open();
    }
}
public class OffCommand extends AbstractCommand {

    private Televatin televatin;

    public void setTelevatin(Televatin televatin) {
        this.televatin = televatin;
    }

    @Override
    public void execute(){
        televatin.off();
    }
}

3.3、调用者

public class RemoteController {

    private AbstractCommand abstractCommand;

    public void setAbstractCommand(AbstractCommand abstractCommand) {
        this.abstractCommand = abstractCommand;
    }

    public void open() throws Exception {
        abstractCommand.execute();
    }

    public void off() throws Exception {
        abstractCommand.execute();
    }
}

3.4、接收者

public class Televatin {

    public void open(){
        System.out.println("televation will open");
    }

    public void off(){
        System.out.println("televation will off");
    }
}

3.5、测试客户端

public class Client  {

    public static void main(String[] args) throws Exception {
        //电视
        Televatin televatin = new Televatin();
        //遥控器开命令
        OpenCommand openCommand = new OpenCommand();
        openCommand.setTelevatin(televatin);
        //遥控器关命令
        OffCommand offCommand = new OffCommand();
        offCommand.setTelevatin(televatin);
        //遥控器
        RemoteController remoteController = new RemoteController();
        remoteController.setAbstractCommand(openCommand);
        //按开按钮
        remoteController.open();

        remoteController.setAbstractCommand(offCommand);
        //按关按钮
        remoteController.off();
    }
}

控制台输出:

televation will open
televation will off

4、模式优点

  • 降低系统耦合度,新的命令能够快速的增加。
  • 比较容易的设计一个命令队列。
  • 比较容易的支持Redo和Undo操作。

5、模式缺点

  • 可能导致系统中具体的命令类会过多。

结束语

Linux系统中,我们的shell脚本封装了一系列的命令,只需要执行脚本,就可以执行一个命令队列。下一篇:设计模式——迭代器模式。

你可能感兴趣的:(设计模式)