设计模式之命令模式(行为型)--- 15
2019-08-04 本文已影响0人
auzqy
- 一、导语
- 二、怎么用
1.样例背景
2.UML类图
3.代码示例- 三、优缺点
- 四、使用场景
1.概括描述
2.现存知名产品中的使用示例- 五、相关设计模式
- 六、参考
一、导语
命令模式(Command),将一个请求封装成一个对象,以便使用不同的请求。
命令模式解决了应用程序中对象的职责以及他们之间的通信方式。
命令模式的优点及使用原则二、怎么用
共有2个示例,代码详见访问链接
下面以example2举例说明
1. 样例背景
模拟顾客去烧烤店吃烧烤的例子
2. UML类图
ACommand ---------------------------------- 抽象的命令类
BakeChickenWingCommand ------------------ 实际烤鸡翅的命令类
BakeMuttonCommand ------------------------ 实际烤羊肉串的命令类
Barbecuer ------------------------------------ 烧烤命令的直接执行者
Waiter ---------------------------------------- 点菜的服务员
3. 代码示例
/**
* description: 命令模式的抽象类
*/
public abstract class ACommand {
protected Barbecuer barbecuer;
public ACommand(Barbecuer barbecuer) {
this.barbecuer = barbecuer;
}
abstract void executeCommand();
}
/**
* description: 烤鸡翅的具体命令
*/
public class BakeChickenWingCommand extends ACommand {
public BakeChickenWingCommand(Barbecuer barbecuer) {
super(barbecuer);
}
@Override
void executeCommand() {
barbecuer.bakeChickenWing();
}
}
/**
* description: 具体的烤羊肉串的类
*/
public class BakeMuttonCommand extends ACommand {
public BakeMuttonCommand(Barbecuer barbecuer) {
super(barbecuer);
}
@Override
void executeCommand() {
barbecuer.bakeMutton();
}
}
/**
* description: 烧烤师傅
*/
public class Barbecuer {
public void bakeMutton(){
System.out.println("烤羊肉串");
}
public void bakeChickenWing(){
System.out.println("烤鸡翅");
}
}
/**
* description: 服务员类
*/
public class Waiter {
private List<ACommand> commandList = new ArrayList<>();
public void setOrder(ACommand command) {
commandList.add(command);
}
public void cancelOrder(ACommand command) {
commandList.remove(command);
}
public void executeAllCommand() {
for (ACommand command : commandList) {
command.executeCommand();
}
commandList.clear();
}
}
public class Test {
public static void main(String[] args) {
Barbecuer barbecuer = new Barbecuer();
ACommand bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer);
ACommand bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer);
ACommand bakeChickenWingCommand = new BakeChickenWingCommand(barbecuer);
Waiter girl = new Waiter();
girl.setOrder(bakeMuttonCommand1);
girl.setOrder(bakeMuttonCommand2);
girl.setOrder(bakeChickenWingCommand);
girl.executeAllCommand();
}
}
执行结果
烤羊肉串
烤羊肉串
烤鸡翅
三、优缺点
-
缺点
1.命令的无限扩展会增加类的数量,提高系统实现复杂度 -
优点
1.降低耦合
2.容易扩展新命令或者一组命令
四、使用场景
1. 概括描述
- 请求的调用者和请求的接收者需要解耦,使调用者和接收者不直接交互
- 需要抽象出等待执行的行为
2. 现存知名产品中的使用示例 todo
2.1 Runnable (jdk)
2.2 junit.framework.Test (junit)
五、与其他设计模式的对比
1. 命令模式和备忘录模式
他们两个经常会结合起来使用,我们可以使用备忘录模式来保存命令的历史记录,
那这样的话就可以调取上一个命令,或者上上个命令,这些都是ok的。