设计模式----行为型模式之命令模式(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设计模式书中。

  

  

  

  

   

posted on 2017-06-26 17:37  轻浅初夏  阅读(134)  评论(0编辑  收藏  举报

导航