zoukankan      html  css  js  c++  java
  • 再战设计模式(十五)之行为型-命令模式

    命令模式

    介绍:将一个请求封装为一个对象,从而是我们使我们可用不同的请求对客户进行参数化,对请求排队或者记录日志,以及支持可撤销的操作,也称为action模式

    角色:

      Command:抽象命令类

      concreteCommand:具体命令类

      Invoke:调用者/请求者

      请求的发送者,它通过命令对象来执行请求,一个调用者并不需要设计的时候确定其接受者,因此它只和抽象命令接口之间存在关系,在程序运行的时候调用命令对象的execute方法,间接调用接受者的相关操作

      receiver:

      接受者执行与请求相关的操作,具体实现对业务的处理

      可以是不同的接受者,或者定义抽象类

      client客户端:

      在客户类中需要创建调用者对象,具体的命令对象,在创建具体命令对象时指定接受者,发送者和接受者之间没有直接的关系,都是通过命令对象间接调用

     类图:

    代码:

    public interface Command {
    
        /**
         * 实际项目中,我们可以根据需求可以设计多个不同的方法
         */
        void execute();
    
    }
    
    public class ConcreteCommandImpl implements Command {
    
        private Receiver receiver;
    
        public ConcreteCommandImpl(Receiver receiver) {
            this.receiver = receiver;
        }
    
        @Override
        public void execute() {
            System.out.println("具体调用.我先看看情况");
            receiver.action();
        }
    }
    
    
    /**
     * 真正命令的执行者
     */
    public class Receiver {
        public void action(){
            System.out.println("Receiver.action(),,,,,,,,,");
        }
    }
    
    
    /**
     * 命令的调用者,和发起者
     */
    public class Invoke {
    
        /**
         * 这里可以是一条,也可以是多条 可以是map 可以是list
         * 数据底层事物就是这样的
         */
        private Command command;
    
        public Invoke(Command command) {
            this.command = command;
        }
    
        /**
         * 调用者,可以做些业务的方法.
         */
        public void call(){
            command.execute();
        }
    }
    
    
    public class Main {
    
        public static void main(String[] args) {
            Command concreteCommand = new ConcreteCommandImpl(new Receiver());
    
            Invoke invoke = new Invoke(concreteCommand);
            invoke.call();
        }
    }

    总结:

    这个模式在项目中很少使用,不过我们还是对它了解一下比较好,在数据的底层事物实现的时候,就是这样的模式

    我对命令模式的理解,就是invoker和receiver 解耦, invoke也可以调用很多命令组成一个庞大的运行逻辑

    感觉它和中介者模式有点类似,不过命令模式可以组成把很多命令组合起来使用.

  • 相关阅读:
    python学习-装饰器
    python-内置函数
    HA高可用解决方案-RHCS部署
    mac安装nose,command not found:nosetests
    iPhone的home键进果汁了,按起来粘粘的感觉
    Reportng 的测试报告在 Jenkins 中显示不全
    atom markdown报错:AssertionError: html-pdf: Failed to load PhantomJS module.
    markdown的图片外链
    reportng定制修改
    运行maven build报错No goals have been specified for this build.
  • 原文地址:https://www.cnblogs.com/bj-xiaodao/p/10886550.html
Copyright © 2011-2022 走看看