命令模式

Posted by 石玉军 on 2018-07-26

命令模式:把命令包装成对象,将命令发送者和命令接受者的耦合降低

举个例子,皇帝发圣旨招一个大臣入宫。

这里的皇帝就是客户端,而圣旨就是命令,大臣就是命令接受者。那么命令发送者通常都是某个公公对吧。这里就是一个命令模式的实践,为什么这样说呢?平常我们写代码都是一个方法直接调用另一个方法,这样耦合性太高了,你总不能让皇帝跑到大臣家告诉他找他有点事吧,要是都这样皇帝不就累死了。皇帝要做的就是指定命令交个哪一个公公,让公公这个命令发送者带着这个命令去找命令接受者,皇帝就在皇宫等着大臣来就行了,而不用关心这从命令交给发送者到命令接受者接收到命令的时候发生了什么。

我们看一下这个类图:
1
Client:皇帝,也就是客户端角色。他指定了圣旨的内容,谁是命令发送人,谁是命令接受者。
Request:公公,也就是命令发送者,他负责带着命令去找接受者
Command:命令接口,例如说所有的圣旨都要有奉天承运,皇帝诏曰等等。
Command:具体命令,在这里就是宣这个大臣进宫的圣旨
Reception:命令接受者,命令接受者,也就是大臣了。

下面来看一下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class Client {
public static void main(String args[]){
Reception reception=new Reception();
Command command=new CommandImpl(reception);
Request request=new Request(command);
request.action();
}
}

public class Request {
private Command command;

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

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

public interface Command {
public void excute();
}

public class CommandImpl implements Command {

private Reception reception;

public CommandImpl(Reception reception){
this.reception=reception;
}
@Override
public void excute() {
reception.action();
}
}

public class Reception {
public void action(){
System.out.println("臣接旨...");
}
}

这样的一个简单的例子就是入门命令模式的demo了,你get到了么?