美文网首页
命令模式

命令模式

作者: lgy_gg | 来源:发表于2017-02-08 10:06 被阅读0次

    1.命令模式概念

    命令模式(Command Pattern),将“请求”封装成对象,以便使用不同的请求,队列或日志来参数化其他对象。命令模式也支持可撤销操作。它属于行为型模式。

    2.命令模式作用

    命令模式将发出请求的对象和执行请求的对象解耦。被解耦的两个对象是通过命令对象来进行沟通的。命令对象封装了接收者和一个或一组动作。调用者可以接收命令作为参数,甚至在运行时动态的进行。

    3.何时使用

    认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。

    4.优点和缺点

    优点
    1、降低了系统耦合度。
    2、新的命令可以很容易添加到系统中去。
    缺点
    使用命令模式可能会导致某些系统有过多的具体命令类。

    5.例子解析

    命令模式类图

    这个例子是关于通过遥控器发出开灯和关灯的命令。命令由遥控器发出,执行者是电灯。
    Command接口:

    public interface Command {
    
        public void excute();
    //undo的作用是撤销操作
        public void undo();
    }
    

    命令的具体对象一:关灯命令

    public class LightOffCommand implements Command{
    
        Light light = null;
        public LightOffCommand(Light light) {
            this.light = light;
        }
        @Override
        public void excute() {
            light.off();
        }
        @Override
        public void undo() {
            light.on();
        }
    }
    

    命令的具体对象:开灯命令

    public class LightOnCommand implements Command {
    
        Light light = null;
        public LightOnCommand(Light light) {
            this.light = light;
        }
        @Override
        public void excute() {
            light.on();
        }
        @Override
        public void undo() {
            light.off();
        }
    }
    

    接收者Receiver(接收命令,执行命令的对象):电灯

    public class Light {
    
        String name;
        public Light(String name) {
            this.name = name;
        }
        public void on() {
            System.out.println(name+" 开灯");
        }
        public void off() {
            System.out.println(name+" 关灯");
        }
    }
    

    Invoker对象:

    public class SimpleRemoteControl {
    
        Command slot;
        public SimpleRemoteControl() {
            // TODO Auto-generated constructor stub
        }
        public void setCommand(Command command) {
            slot = command;
        }
        public void buttonWasPress() {
            slot.excute();
        }
    }
    

    客户端对象:

    /**
     * @author Administrator
     * 用电灯做例子:
     *  Invoker---SimpleRemoteControl
     *  Command---Command
     *  ConreteCommand---LightOnCommand,LightOffCommand
     *  Receiver---Light
     */
    public class RemoteControlTest {
    
        public static void main(String[] args) {
            SimpleRemoteControl simpleRemoteControl = new SimpleRemoteControl();
            simpleRemoteControl.setCommand(new LightOnCommand(new Light("Living Room")));
            simpleRemoteControl.buttonWasPress();
        }
    }
    

    6.源码地址

    http://download.csdn.net/detail/lgywsdy/9749545

    7.参考文章

    http://www.runoob.com/design-pattern/command-pattern.html

    相关文章

      网友评论

          本文标题:命令模式

          本文链接:https://www.haomeiwen.com/subject/rfrvittx.html