• 设计模式----行为型模式之命令模式(Command Pattern)


      下面来自head first设计模式的命令模式一章节。

    • 定义

      将"请求"封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

    • 类图

      

      注:

        1、Client:该类主要创建concreteCommand类,并设置其接收者Recevier;

        2、Receiver:该类为接收者类,该类主要是负责接收命令,和执行命令;

        3、Command:该类为 所有命令的抽象类或或接口,该类具备抽象方法execute/undo方法;

        4、Invoker:该类为调用者,该调用者内部持有一个命令对象,调用者在特定时间可以调用内部方法来执行命令对象的execute/undo方;

        5、ConcreteCommand:该类为Command抽象的实现,该类定义了动作与接受者之间的绑定关系

      维基和书上的例子应用结合:

      

    /**
     * Invoker 调用者
     * @author mjs
     * @version 1.0.0
     * @filename Switch.java
     * @time 2017-6-26 下午4:38:31
     * @copyright(C) 2017 **********有限公司
     */
    package command;
    
    public class Switch {
        private Command command;
        public Switch(){
        }
        /**
         * 持有命令对象初始化
         * @param cmd
         */
        public void setComman(Command cmd){
            this.command = cmd;
        }
        /**
         * 执行命令
         */
        public void execute(){
            command.execute();
        }
    }
    /**
     * 所有命令的抽象接口
     * @author mjs
     * @version 1.0.0
     * @filename Command.java
     * @time 2017-6-16 下午4:51:30
     * @copyright(C) 2017 **********有限公司
     */
    package command;
    
    public interface Command {
        void execute();
    }
    /**
     * 开灯命令
     * @author mjs
     * @version 1.0.0
     * @filename FlipUpCommand.java
     * @time 2017-6-26 下午4:45:45
     * @copyright(C) 2017 **********有限公司
     */
    package command;
    
    public class FlipUpCommand implements Command {
        private Light light;
        public FlipUpCommand(Light light){
            this.light = light;
        }
        public void execute() {
            light.turnOn();
        }
    
    }
    /**
     * 关灯命令
     * @author mjs
     * @version 1.0.0
     * @filename FlipDownCommand.java
     * @time 2017-6-26 下午5:12:28
     * @copyright(C) 2017 **********有限公司
     */
    package command;
    
    public class FlipDownCommand implements Command {
        private Light light;
        public FlipDownCommand(Light light){
            this.light = light;
        }
        public void execute() {
            light.turnOff();
        }
    
    }
    /**
     * Receiver 灯(命令的接收者)
     * @author mjs
     * @version 1.0.0
     * @filename Light.java
     * @time 2017-6-26 下午4:47:00
     * @copyright(C) 2017 **********有限公司
     */
    package command;
    
    public class Light {
        public Light() {
        }
        /**
         * 开灯
         */
        public void turnOn(){
            System.out.println("The light is on");
        }
        /**
         * 关灯
         */
        public void turnOff(){
            System.out.println("The light is off");
        }
        
    }
    /**
     * TODO
     * @author mjs
     * @version 1.0.0
     * @filename Client.java
     * @time 2017-6-26 下午5:18:47
     * @copyright(C) 2017 **********有限公司
     */
    package command;
    
    public class Client {
        public static void main(String[] args) {
            //创建concreteCommand类,并设置其接收者Recevier
            Command switchUp = new FlipUpCommand(new Light());
            //创建调用者Invoker
            Switch lightSwitch = new Switch();
            lightSwitch.setComman(switchUp);
            //执行命令对象动作
            lightSwitch.execute();
            /**
             * 输出:
             *     The light is on
             */
        }
    }

      例子比较简单,调用者方可以使用list数组形式存储多个命令,客户端利用控制台输入来执行更多操作。

      上面内容主要来自head first设计模式书中。

      

      

      

      

       

  • 相关阅读:
    6、函数、谓词、CASE表达式
    25. k个一组翻转链表
    78. 子集
    72. 编辑距离
    12. 整数转罗马数字
    287. 寻找重复数
    27. 移除元素
    91. 解码方法
    283. 移动零
    198. 打家劫舍
  • 原文地址:https://www.cnblogs.com/mjs154/p/7015976.html
Copyright © 2020-2023  润新知