命令模式

好久不见. 提交于 2020-04-07 04:45:47

命令模式(Command Pattern)在我们生活中非常常见,比如开关灯、电视遥控器换台等。

我们使用摇控器换台的时候,我们按下一个换台的按钮,然后电视机就会换台,按下调整音量调节按钮,电视机的音量也会进行相应的调整。

这个过程中:

1、我们发出增加音量命令(按下按钮)

2、遥控器接收到消息(命令请求者),给电视机发送请求

3、命令(调节音量或者换台等),红外等形式发出信号

4、电视接收信号,解析具体命令

5、执行命令

这就是一个命令模式,大概有以下几个角色:

  • Client(客户端),也就是消费者端

  • Invoker(请求者/调用者)

  • Command(命令,一般是接口或者抽象类)

  • ConcreteCommand(具体的命令实现类)

  • Receiver(接收者,执行具体操作)

如下图所示,即是命令模式的UML图:

然后我们来看一下代码怎么实现:

Command

/**
 * 命令接口
 */
public interface Command {
    void execute();
}

AdjustVolumnCommand


/**
 * 调节音量
 */
public class AdjustVolumnCommand implements Command {

    private TV tv;

    public AdjustVolumnCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.ajductVolumn();
    }
}

ChangeChannelCommand


/**
 * 换台
 */
public class ChangeChannelCommand implements Command {

    private TV tv;

    public ChangeChannelCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.changeChannel();
    }
}

TV

public class TV {

    public void changeChannel() {
        System.out.println("换台");
    }

    public void ajductVolumn() {
        System.out.println("调节音量");
    }
}

Control

public class Control {

    private Command command;

    public Control(Command command) {
        this.command = command;
    }

    public void action() {
        command.execute();
    }
}

ClientDemo

public class ClientDemo {

    public static void main(String[] args) {

        TV tv = new TV();
        Command command = new AdjustVolumnCommand(tv);
        Control control = new Control(command);
        control.action();
    }
}

UML图如下所示:

命令模式将一个调用过程封装成一个对象Command,从而将调用者(Invoker)与接收者(Receiver,真正的执行者)解耦。

 

 

参考文章:

https://en.wikipedia.org/wiki/Command_pattern

https://www.cnblogs.com/jmcui/p/10042235.html#_label0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!