设计模式-命令模式

命令模式

  在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个。我们只需在程序运行时指定具体的请求接收者即可,此时可以使用命令模式来进行设计,使得请求发送者和接受者之间消除耦合,让对象的调用关系更加灵活。

  命令模式可以对发送者和接受者完全解耦,发送者和接受者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的动机。

例子

命令的执行者

1
2
3
4
5
6
7
8
9
10
11

public class Light {

public void on() {
System.out.println("灯打开了");
}

public void off() {
System.out.println("灯关了");
}
}

抽象命令接口

1
2
3
4
5
6
7

public interface Command {


void execute();

}

具体命令实现类

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

public class LightOffCommand implements Command {

private Light light;

public LightOffCommand(Light light) {
this.light = light;
}

@Override
public void execute() {
light.off();
}
}


public class LightOnCommand implements Command {

private Light light;

public LightOnCommand(Light light) {
this.light = light;
}

@Override
public void execute() {
light.on();
}
}

调用者类

这里假设为遥控器

1
2
3
4
5
6
7
8
9
10
11
12
13
14

public class Controller {

private Command command;

public void setCommand(Command command) {
this.command = command;
}

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

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public void test() {
Controller controller = new Controller();
Light light = new Light();
LightOffCommand lightOffCommand = new LightOffCommand(light);
LightOnCommand lightOnCommand = new LightOnCommand(light);

controller.setCommand(lightOffCommand);
controller.buttonOnPressed();
controller.setCommand(lightOnCommand);
controller.buttonOnPressed();
}


/**
灯关了
灯打开了
**/

总结

命令模式的好处在于可以将命令的请求这和命令的执行者进行解耦,但是在复杂场景下,命令类会变得很多,不方便进行管理。

-------------本文结束感谢您的阅读-------------

本文标题:设计模式-命令模式

文章作者:小建儿

发布时间:2018年08月18日 - 11:08

最后更新:2018年08月18日 - 12:08

原始链接:http://yajian.github.io/设计模式-命令模式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。