• 命令模式


    命令模式共有4个角色: Command, ConcurrentCommand, Reciever, Invoker

    Command : 抽象命令类, 定义了Reciver成员和抽象方法executeCommand()用于执行命令

    ConcurrentCommand : 具体实现命令类, 继承自Command类并实现了抽象方法executeCommand()

    Reciver : 实际命令执行者, executeCommand()所产生的行为由Reciever实现

    Invoker : 定义了Command成员,是Command的调用者

    命令模式的优点是命令记录/撤销功能,可以批次执行命令,并且命令的产生与执行解耦,生成新的命令不需要修改源代码

     1 package command;
     2 
     3 public abstract class Command {
     4     protected Reciever reciever;
     5     
     6     protected Command(Reciever reciever) {
     7         this.reciever = reciever;
     8     }
     9     
    10     public abstract void executeCommand();
    11 }
    12 
    13 package command;
    14 
    15 public class ConcurrentCommand1 extends Command {
    16     protected ConcurrentCommand1(Reciever reciever) {
    17         super(reciever);
    18     }
    19 
    20     @Override
    21     public void executeCommand() {    // 如果需要撤销命令,则在此处插入判断条件,达成条件是撤销命令执行
    22         reciever.action();
    23         System.out.println("command1 executed");
    24     }
    25 }
    26 
    27 package command;
    28 
    29 public class ConcurrentCommand2 extends Command {
    30     protected ConcurrentCommand2(Reciever reciever) {
    31         super(reciever);
    32     }
    33 
    34     @Override
    35     public void executeCommand() {
    36         reciever.action();
    37         System.out.println("command2 executed");
    38     }
    39 }
    40 
    41 package command;
    42 
    43 public class Reciever {
    44     private String name;
    45     
    46     public Reciever(String name) {
    47         this.name = name;
    48     }
    49     
    50     public void action() {
    51         System.out.println("I'm " + name + ". Let me do it!");
    52     }
    53 }
    54 
    55 package command;
    56 
    57 public class Invoker {
    58     public Command command;  // 如果需要批量执行命令,则在此处将command变为command数组,最后在使用for执行命令
    59     
    60     public void setCommand(Command command) {
    61         this.command = command;
    62     }
    63     
    64     public void executeCommand() {
    65         command.executeCommand();
    66     }
    67 }
    68 
    69 package command;
    70 
    71 public class Test {
    72     public static void main(String[] args) {
    73         Reciever reciever = new Reciever("Jack");
    74         Command command1 = new ConcurrentCommand1(reciever);
    75         Command command2 = new ConcurrentCommand2(reciever);
    76         Invoker invoker = new Invoker();
    77         invoker.setCommand(command1);
    78         invoker.executeCommand();
    79         invoker.setCommand(command2);
    80         invoker.executeCommand();
    81     }
    82 }
    83 
    84 // ...

    程序输出

    I'm Jack. Let me do it!
    command1 executed
    I'm Jack. Let me do it!
    command2 executed

  • 相关阅读:
    StringGrid 实例3: 本例功能: 1、修改 TStringGrid的默认宽与高; 2、添加行; 3、确认当前单元并赋值.
    StringGrid 实例2:1、获取 StringGrid 的行数、列数; 2、给单元赋值.
    StringGrid 实例1:初始化StirngGrid的首行和首列
    stringgrid事件大全
    firemonkey中stringgrid属性大全
    DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?
    CoolTrayIcon4.0
    Delphi七个版本
    基础
    按钮打开链接,按钮click代码
  • 原文地址:https://www.cnblogs.com/zemliu/p/2915086.html
Copyright © 2020-2023  润新知