命令模式
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