命令模式(Command Pattern)

    • 重复多次
    • 取消(如果该物件有实作的话)
    • 取消后又再重做

    这些都是现代大型应用程序所必须的功能,即“复原”及“重复”。除此之外,可以用命令模式来实作的功能例子还有:

    • 交易行为
    • 进度列
    • 精灵
    • 使用者界面按钮及功能表项目
    • 执行绪 pool
    • 宏收录

    JavaScript

    1. import java.util.ArrayList;
    2. /* The Command interface */
    3. public interface Command {
    4. void execute();
    5. }
    6. /* The Invoker class */
    7. public class Switch {
    8. private List<Command> history = new ArrayList<Command>();
    9. public Switch() {
    10. }
    11. public void storeAndExecute(Command cmd) {
    12. this.history.add(cmd); // optional
    13. cmd.execute();
    14. }
    15. }
    16. /* The Receiver class */
    17. public class Light {
    18. public Light() {
    19. }
    20. public void turnOn() {
    21. System.out.println("The light is on");
    22. }
    23. public void turnOff() {
    24. System.out.println("The light is off");
    25. }
    26. }
    27. /* The Command for turning on the light - ConcreteCommand #1 */
    28. public class FlipUpCommand implements Command {
    29. private Light theLight;
    30. public FlipUpCommand(Light light) {
    31. this.theLight = light;
    32. }
    33. public void execute(){
    34. theLight.turnOn();
    35. }
    36. }
    37. /* The Command for turning off the light - ConcreteCommand #2 */
    38. public class FlipDownCommand implements Command {
    39. private Light theLight;
    40. public FlipDownCommand(Light light) {
    41. this.theLight = light;
    42. }
    43. theLight.turnOff();
    44. }
    45. }
    46. /* The test class or client */
    47. public class PressSwitch {
    48. public static void main(String[] args){
    49. Light lamp = new Light();
    50. Command switchDown = new FlipDownCommand(lamp);
    51. Switch mySwitch = new Switch();
    52. try {
    53. if ("ON".equalsIgnoreCase(args[0])) {
    54. mySwitch.storeAndExecute(switchUp);
    55. }
    56. else if ("OFF".equalsIgnoreCase(args[0])) {
    57. mySwitch.storeAndExecute(switchDown);
    58. }
    59. else {
    60. System.out.println("Argument \"ON\" or \"OFF\" is required.");
    61. }
    62. } catch (Exception e) {
    63. System.out.println("Arguments required.");
    64. }
    65. }
    66. }

    实例

    紧耦合设计

    1. //烤肉串者
    2. public class Barbecuer
    3. {
    4. //烤羊肉
    5. public void BakeMutton()
    6. {
    7. Console.WriteMutton("烤羊肉串");
    8. }
    9. //烤鸡翅
    10. public void BakeChikenWing()
    11. {
    12. Console.WriteMutton("烤鸡翅");
    13. }
    14. }

    客户端调用

    松耦合设计

    抽象命令类

    1. //抽象命令
    2. public abstract class Command
    3. {
    4. protected Barbecuer receiver;
    5. public Command(Barbecuer receiver)
    6. {
    7. this.receiver = receiver;
    8. }
    9. //执行命令
    10. abstract public ExcuteCommand();
    11. }

    具体命令类

    1. //烤羊肉命令
    2. class BakeMuttonCommand: Command
    3. {
    4. public BakeMuttonCommand(Barbecuer receiver)
    5. {
    6. :base(receiver)
    7. }
    8. public override void EccuteCommand()
    9. {
    10. receiver.BakeMutton();
    11. }
    12. }
    13. //烤鸡翅命令
    14. {
    15. {
    16. :base(receiver)
    17. }
    18. public override void EccuteCommand()
    19. {
    20. receiver.BakeChickenWing();
    21. }
    22. }
    1. //烤肉串者
    2. public class Barbecuer
    3. {
    4. //烤羊肉
    5. public void BakeMutton()
    6. {
    7. Console.WriteMutton("烤羊肉串");
    8. }
    9. //烤鸡翅
    10. public void BakeChikenWing()
    11. {
    12. Console.WriteMutton("烤鸡翅");
    13. }
    14. }

    客户端实现

    1. static void Main(string[] args)
    2. {
    3. //开店前的准备
    4. Barbecuer boy = new Barbecuer();
    5. Command BakeMuttonCommand1 = new BakeMuttonCommand(boy);
    6. Command BakeMuttonCommand2 = new BakeMuttonCommand(boy);
    7. Command BakeChickenWingCommand1 = new BakeMuttonCommand(boy);
    8. Waiter girl = new Waiter();
    9. //开门营业
    10. girl.SetOrder(BakeMuttonCommand1);
    11. girl.Notify();
    12. girl.SetOrder(BakeMuttonCommand2);
    13. girl.Notify();
    14. girl.SetOrder(BakeChickenWingCommand1);
    15. girl.Notify();
    16. COnsole.Read();
    17. }

    松耦合后

    客户端代码实现

    1. static void Main(string[] args)
    2. {
    3. Barbecuer boy = new Barbecuer();
    4. Command BakeMuttonCommand1 = new BakeMuttonCommand(boy);
    5. Command BakeMuttonCommand2 = new BakeMuttonCommand(boy);
    6. Command BakeChickenWingCommand1 = new BakeMuttonCommand(boy);
    7. Waiter girl = new Waiter();
    8. girl.setOrder(bakeMuttonCommand1);
    9. girl.setOrder(bakeMuttonCommand1);
    10. girl.setOrder(BakeChickenWingCommand1);
    11. girl.Notify();
    12. Console.Read();
    13. }

    命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数话;对请求排队或者纪录请求日志,以及支持可撤销的操作。

    • 容易地设计一个命令队列。
    • 在需求的情况下,比较容易地将命令记入日志。
    • 允许接受请求的一方决定是否要回绝请求。
    • 很容易对请求撤销或者重做。
    • 加入新的命令类不影响其它的类。