【行为型】命令模式
定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式中角色:
1.抽象命令角色(AbstractCommand):将共同执行的命令方法进行抽象
2.具体命令角色(ConcreteCommand):对抽象类中的方法进行实现
3.处理事务角色(Receiver):负责接收命令,并执行命令
4.调用命令角色(Invoker):负责调用命令
命令模式优点:
1.封装性很好:每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需知道命令具体是怎么执行的。比如有一组文件操作的命令:新建文件、复制文件、删除文件。如果把这三个操作都封装成一个命令类,客户端只需要知道有这三个命令类即可,至于命令类中封装好的逻辑,客户端则无需知道。
2.在命令模式中,在接收者类中一般会对操作进行最基本的封装,命令类则通过对这些基本的操作进行二次封装,当增加新命令的时候,对命令类的编写一般不是从零开始的,有大量的接收者类可供调用,也有大量的命令类可供调用,代码的复用性很好。比如,文件的操作中,我们需要增加一个剪切文件的命令,则只需要把复制文件和删除文件这两个命令组合一下就行了,非常方便。
命令模式缺点:
1.最后说一下命令模式的缺点,那就是命令如果很多,随之对应的类也会增加
UML图
1
2
3
4
5
6
7
8
9
10
11
_ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | | | |
| client | | Invoker |---→| AbstractCommand |
|__ _ _ _| |_ _ _ _ _| |_ _ _ _ _ _ _ _ _|
| ↑
| |
| |
| _ _ _ _ _ _ _ _ _ _|_ _ _ _ _
└----→| | | |
| Receiver |←-----| ConcreteCommand |
|_ _ _ _ _ _| |_ _ _ _ _ _ _ _ _|
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//调用命令角色
public class CEO{
private Leader leader;
public void setCoder(Leader leader){
this.leader = leader;
}
public void do(){
leader.execute();
}
}
1
2
3
4
5
6
//抽象命令角色
public abstract class Leader{
public abstract void execute();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//具体命令角色
public class Jack extends Leader{
private Coder coder;
public Jack(Coder coder){
this.coder = coder;
}
@implement
public void execute(){
coder.work();
}
}
1
2
3
4
5
6
7
8
public class Coder{
public void work(){
System.out.println("I'm coder and I will do my best!");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Client{
public static void main(String[] args){
Coder coder = new Coder();
Leader jack = new Jack(coder);
CEO ceo = new CEO();
ceo.setLeader(jack);
ceo.do();
}
}
运行结果:
I'm coder and I will do my best!
应用
既然是命令模式,当然是大懒拖小懒,最后苦命的只有码农了…