我的理解Command Pattern
设计一个命令的执行者,它负责执行命令,但是它并不知道这个命令是什么,它只负责去执行就好了,而且这个命令也总是会被正确的执行。
其实在看了前几页对这个模式的描述,差不多脑海中就已经构思出这个模式的大概实现了。
比较生动的2个例子:
1. 你去一家餐厅吃饭。当你把菜单点好,服务员会把你的菜单送到厨师那里,厨师会帮你做好你点的菜。就这么简单:其中服务员就相当于是命令的执行者一样,她并不需要你知道你点的是什么,她只要对厨师说(执行命令):把这个菜单上的菜做好!然后过几分钟,你就可以吃到想吃的东西了。
2. 设计一个家庭自动遥控系统。你的家里有各式各样的家电设备,你想要用一个遥控器就可以控制所有的这些家电,不用为每一个家电都配上一个遥控器,这样是不是很方便?在这里遥控器就是一个典型的命令执行者,你可以向它发送打开电视机,关掉空调等命令,遥控器接受了命令就执行你想要的命令。
下面是一个具体的实现(针对第2个例子)
因为命令的执行者并不知道具体的命令是什么,具体的命令是我们发给它的,这里很自然而然的就应该想到多态的用处了。
interface
Command
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
void Excute()
}
class
TVOnCommand
implements
Command
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
TV tv; //电视类
TVOnCommand(TV tv)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.tv = tv;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
void excute()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
tv.on()
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
System.out.println(“tv turn on”);
}
}
Class RemoteControl
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
public
Command command;
void setCommand(Command com) //接收具体的命令了
This->command = com;
}
Void OnPressButton()
//
这里遥控器打开按钮并不知道它打开到底的是TV还是Fan
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
Command.excture()
}
}
设计一个命令的执行者,它负责执行命令,但是它并不知道这个命令是什么,它只负责去执行就好了,而且这个命令也总是会被正确的执行。
其实在看了前几页对这个模式的描述,差不多脑海中就已经构思出这个模式的大概实现了。
比较生动的2个例子:
1. 你去一家餐厅吃饭。当你把菜单点好,服务员会把你的菜单送到厨师那里,厨师会帮你做好你点的菜。就这么简单:其中服务员就相当于是命令的执行者一样,她并不需要你知道你点的是什么,她只要对厨师说(执行命令):把这个菜单上的菜做好!然后过几分钟,你就可以吃到想吃的东西了。
2. 设计一个家庭自动遥控系统。你的家里有各式各样的家电设备,你想要用一个遥控器就可以控制所有的这些家电,不用为每一个家电都配上一个遥控器,这样是不是很方便?在这里遥控器就是一个典型的命令执行者,你可以向它发送打开电视机,关掉空调等命令,遥控器接受了命令就执行你想要的命令。
下面是一个具体的实现(针对第2个例子)
因为命令的执行者并不知道具体的命令是什么,具体的命令是我们发给它的,这里很自然而然的就应该想到多态的用处了。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
下面就是我们具体的命令类了,你可以按你的需求设计你想要的命令类。命令的真正执行者可以以参数传递给命令。你需要为每一个Receiver的每一个动作设计一个命令。这里就以一个电视的打开命令为例。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
我们的遥控器类:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
Command模式举例:
线程池: 有一个命令接收队列,一端负载传递命令进去,另一端则有几个线程(由你决定的)从队列中取出命令,并执行这个命令。你的线程可能这次执行的是计算,下次取得执行的命令可能是接收数据。它并不知道这些命令是什么,它只是执行它就可以了。