命令模式

2017-02-08  本文已影响0人  lgy_gg

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

上一篇下一篇

猜你喜欢

热点阅读