← 返回首页
设计模式基础教程(二十四)
发表时间:2021-08-27 17:59:08
命令模式

1.命令模式

在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。

命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

命令模式包含如下角色: - Command: 抽象命令类 - ConcreteCommand: 具体命令类 - Invoker: 调用者 - Receiver: 接收者 - Client:客户类

2.实例

电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。显然,电视机遥控器就是一个典型的命令模式应用实例。

项目结构图如下:

抽象命令接口

public interface AbstractCommand {
    void execute();
}

遥控器类

public class Controller {

    private AbstractCommand openCommand,closeCommand,changeCommand;

    public Controller(AbstractCommand openCommand,
            AbstractCommand closeCommand, AbstractCommand changeCommand) {
        super();
        this.openCommand = openCommand;
        this.closeCommand = closeCommand;
        this.changeCommand = changeCommand;
    }

    public void open(){
        this.openCommand.execute();
    }

    public void close(){
        this.closeCommand.execute();
    }
    public void change(){
        this.changeCommand.execute();
    }
}

电视机类

public class Television {
    public void open(){
        System.out.println("打开电视...");
    }
    public void close(){
        System.out.println("关闭电视...");
    }
    public void changeChannel(){
        System.out.println("切换电视频道...");
    }
}

打开电视命令类

public class TVOpenCommand implements AbstractCommand {

    private Television television;
    public TVOpenCommand(Television television){
        this.television=television;
    }
    @Override
    public void execute() {
        this.television.open();
    }
}

切换频道命令类

public class TVChangeCommand implements AbstractCommand {

    private Television television;
    public TVChangeCommand(Television television){
        this.television=television;
    }
    @Override
    public void execute() {
        this.television.changeChannel();
    }
}

关闭电视命令类

public class TVCloseCommand implements AbstractCommand {
    private Television television;
    public TVCloseCommand(Television television){
        this.television=television;
    }
    @Override
    public void execute() {
        this.television.close();
    }
}

测试类

public class TestCommandPatternDemo01 {

    public static void main(String[] args) {
        AbstractCommand openCommand,closeCommand,changeCommand;

        Television television=new Television();
        openCommand=new TVOpenCommand(television);
        closeCommand=new TVCloseCommand(television);
        changeCommand=new TVChangeCommand(television);

        Controller controller = new Controller(openCommand,closeCommand,changeCommand);
        controller.open();
        controller.change();
        controller.close();
    }

}
运行结果:
打开电视...
切换电视频道...
关闭电视...