• 设计模式笔记 ------ 命令模式


      何为命令?就是有人发出,有人执行,有人得到结果。命令发出的人不在乎怎么执行的,只要结果。

    命令模式:将一个请求封装成一个对象,使得你用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

      命令模式,顾名思义来理解即可,就是客户端发布一个命令(也就是“请求”),而这个命令是已经被封装成一个对象的。即这个命令对象的内部可能已经指定了该命令具体被谁负责执行。就像开发经理从客户那边获取对方的需求(命令),客户在描述具体的需求可以决定是否明确指出该需求的执行方。

      先看类图

      上图中,Invoker 类就相当于开发经理,ConcreteCommand 类是具体的命令,它继承自抽象命令类 AbstractCommand 类,该抽象类中定义了每个命令被执行的方法 execute() 。Receiver 抽象类定义了对每一个具体的命令的执行方法 action() ,一旦接收到命令则立即行动。这里应该注意的是,每个具体的命令类都必须指定该命令的接收者,否则这命令发布了也没相应的人来完成,那就没戏了。

      下面是具体实现。

      命令接收者相关类:

        //抽象接收者,定义了每个接收者应该完成的业务逻辑  
        abstract class AbstractReceiver {  
            public abstract void doJob();  
        }  
         
        // 具体接收者01,实现自己真正的业务逻辑  
        class Receiver01 extends AbstractReceiver {  
            public void doJob() {  
                System.out.println("接收者01 完成工作 ...
    ");  
            }  
        }  
         
        // 具体接收者02,实现自己真正的业务逻辑  
        class Receiver02 extends AbstractReceiver {  
            public void doJob() {  
                System.out.println("接收者02 完成工作 ...
    ");  
            }  
        } 
    

       命令类:

        // 抽象命令类,定义了每个具体命令被执行的入口方法execute()  
        abstract class AbstractCommand {  
            public abstract void execute();  
        }  
         
        // 具体命令类01,通过构造函数的参数决定了该命令由哪个接收者执行  
        class Command01 extends AbstsractCommand {  
            private AbstractReceiver receiver = null;  
         
            public Command01(AbstractReceiver receiver) {  
                this.receiver = receiver;  
            }  
         
            public void execute() {  
                      System.out.println("命令01 被发布 ...");  
                this.receiver.doJob();  
            }  
        }  
         
        // 具体命令类02,通过构造函数的参数决定了该命令由哪个接收者执行  
        class Command02 extends AbstractCommand {  
            private AbstractReceiver receiver = null;  
         
            public Command02(AbstractReceiver receiver) {  
                this.receiver = receiver;  
            }  
         
            public void execute() {  
                      System.out.println("命令02 被发布 ...");  
                this.receiver.doJob();  
            }  
        } 
    

       调用者类:

        // 调用者,负责将具体的命令传送给具体的接收者  
        class Invoker {  
            private AbstractCommand command = null;  
         
            public void setCommand(AbstractCommand command) {  
                this.command = command;  
            }  
         
            public void action() {  
                this.command.execute();  
            }  
        } 
    

       测试类:

        //测试类  
        public class Client {  
            public static void main(String[] args) {  
                // 创建调用者  
                Invoker invoker = new Invoker();  
         
                // 创建一个具体命令,并指定该命令被执行的具体接收者  
                AbstractCommand command01 = new Command01(new Receiver01());  
         
                // 给调用者发布一个具体命令  
                invoker.setCommand(command01);  
         
                // 调用者执行命令,其实是将其传送给具体的接收者并让其真正执行  
                invoker.action();  
                  
                AbstractCommand command02 = new Command01(new Receiver02());  
                invoker.setCommand(command02);  
                invoker.action();  
            }  
        } 
    

       结果:

    1.本质:对命令进行封装,将发出命令与执行命令的责任分开。
    2.每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
    3.请求方和接收方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
    4.使请求本身成为一个对象,这个对象和其它对象一样可以被存储和传递。
    5.命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

      总结:命令模式主要通过中介Command实现了发出命令者和命令的执行者,也即Invoke类和Receiver的松耦合。本文先给出了命令模式的定义,通过吃饭的例子给出了使用命令模式实现遥控器设计思路,最后还提到了撤销命令和一个命令实现多个命令的做法。

  • 相关阅读:
    Windows进程端口相关命令
    SpringMVC获取请求的匹配方法对应的路径
    Feign配置远程调用时携带原请求的token
    LINUX的patch文件 何打patch
    如何制作LINUX的patch文件及如何打patch
    (转) 跟我一起写 Makefile --- 陈皓
    u-boot移植到mini2440,增加DM9000驱动的学习笔记
    DNW PL2303驱动解决问题
    kermit的安装,配置
    wpf中bool按钮三种方式
  • 原文地址:https://www.cnblogs.com/adamJin/p/7411560.html
Copyright © 2020-2023  润新知