设计模式之命令模式(卷十四)
2018-01-12 11:43
253 查看
通过引入一个命令类,减少发送者和接受者之间的耦合。
Receiver:接受者,命令的具体执行者。
Command:抽象命令类,声明了执行请求的方法。
ConcreteCommand:具体命令类,持有接受者,实现了处理请求的方法。
架构UML图如下。
缺点:导致具体命令类膨胀。
适用场景:系统需要降低调用者和接受者之间的耦合,提供undo操作。
0x00 组成部分
Invoker:调用者,持有命令对象的引用。Receiver:接受者,命令的具体执行者。
Command:抽象命令类,声明了执行请求的方法。
ConcreteCommand:具体命令类,持有接受者,实现了处理请求的方法。
架构UML图如下。
0x01 实例代码
以MOBA类游戏为例,其中键盘充当调用者,具体游戏角色充当接受者,键盘上的按键充当命令。package com.kkk.pattern.command1; import java.util.HashMap; import java.util.Map; /** * HHKB键盘,充当调用者。 * Created by z3jjlzt on 2018/1/12. */ public class HHKB { //键盘上持有一系列按键集合。 private static final Map<String, Skill> btns = new HashMap<>(); public HHKB addBtn(String k, Skill v) { btns.put(k, v); return this; } public void removeBtn(String k) { btns.remove(k); } public void pressBtn(String btn) { if (btns.containsKey(btn)){ btns.get(btn).play(); } else { System.out.println(btn + "技能冷却中!!"); } } } /** * LOLRole,充当技能的接受者。 * Created by z3jjlzt on 2018/1/12. */ public class LOLRole { private String name; public LOLRole(String name) { this.name = name; } public void action(String action) { System.out.println(name + "释放了 " + action + "技能"); } } /** * 技能接口,充当抽象命令类。 * Created by z3jjlzt on 2018/1/12. */ public abstract class Skill { //持有接受者引用。 protected LOLRole LOLRole; protected void setLOLRole(LOLRole LOLRole) { this.LOLRole = LOLRole; } public abstract void play(); } /** * Q技能,充当具体命令类。 * Created by z3jjlzt on 2018/1/12. */ public class SkillQ extends Skill{ @Override public void play() { LOLRole.action("Q"); } } public class Client { public static void main(String[] args) { Skill q, w, e, r; q = new SkillQ(); w = new SkillW(); e = new SkillE(); r = new SkillR(); LOLRole river = new LOLRole("River"); q.setLOLRole(river); w.setLOLRole(river); e.setLOLRole(river); r.setLOLRole(river); HHKB hhkb = new HHKB(); hhkb.addBtn("q", q) .addBtn("w", w) .addBtn("e", e) .addBtn("r", r); hhkb.pressBtn("e"); hhkb.pressBtn("r"); hhkb.pressBtn("w"); hhkb.pressBtn("q"); hhkb.pressBtn("r"); hhkb.removeBtn("w"); hhkb.pressBtn("w"); } } 结果: River释放了 E技能 River释放了 R技能 River释放了 W技能 River释放了 Q技能 River释放了 R技能 w技能冷却中!!
0xff 总结
优点:降低调用者和接受者的耦合,添加新的命令符合开闭原则,为undo提供了解决方法。缺点:导致具体命令类膨胀。
适用场景:系统需要降低调用者和接受者之间的耦合,提供undo操作。
相关文章推荐
- C#设计模式之十四命令模式(Command Pattern)【行为型】
- C++设计模式之十四:Command(命令)
- 设计模式(十四)----- 命令模式(Command)----(JAVA版)
- java设计模式(十四)--命令模式
- 设计模式(十四):Command命令模式 -- 行为型模式
- JAVA设计模式(十四)----命令模式
- 小话设计模式(十四)命令模式
- 设计模式笔记之十四 (命令模式)
- C#设计模式之十四命令模式(Command Pattern)【行为型】
- Android编程设计模式之命令模式详解
- 设计模式心得:命令模式 (command pattern)
- 23种设计模式之命令模式
- 设计模式 笔记 命令模式 Command
- 设计模式的艺术之道--命令模式
- 设计模式之Command - 命令模式
- 设计模式之命令模式(十三)
- 设计模式学习笔记(十四)——结构型模式总结
- 被说了很多遍的设计模式---命令模式
- 极速理解设计模式系列:17.命令模式(Command Pattern)
- 设计模式六之命令模式1