zoukankan      html  css  js  c++  java
  • 设计模式笔记 ------ 命令模式

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

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

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

      先看类图

      上图中,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的松耦合。本文先给出了命令模式的定义,通过吃饭的例子给出了使用命令模式实现遥控器设计思路,最后还提到了撤销命令和一个命令实现多个命令的做法。

  • 相关阅读:
    Atitit 趋势管理之道 attilax著
    Atitit 循环处理的新特性 for...else...
    Atitit 2017年的技术趋势与未来的大技术趋势
    atitit 用什么样的维度看问题.docx 如何了解 看待xxx
    atitit prj mnrs 项目中的几种经理角色.docx
    Atitit IT办公场所以及度假村以及网点以及租房点建设之道 attilax总结
    Atitit 工具选型的因素与方法 attilax总结
    Atitit.团队文化建设影响组织的的一些原理 法则 定理 效应 p826.v4
    Atiitt 管理方面的误区总结 attilax总结
    Atitit 未来趋势把控的书籍 attilax总结 v3
  • 原文地址:https://www.cnblogs.com/adamJin/p/7411560.html
Copyright © 2011-2022 走看看