命令模式(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
来源:oschina
链接:https://my.oschina.net/mingshashan/blog/3221591