*通常情况下:行为请求者与实现者通常呈现一种高度耦合状态。有时要对行为进行变更处理处理,高度耦合方式就显得不合适。
* 将行为请求者与行为实现者解耦,将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)。
* 命令模式通常由这几部分组成:命令接口,具体命令(实现命令接口),接受命令的对像,命令控制器等组成。
* 模式的优势:
1.降低对象之间的耦合度。
2.新的命令可以很容易地加入到系统中及设计一个组合命令。
4.实现调用相同方法来实现不同的功能。
模式的不足之处:
每一个命令都要设计一个具体的类,命令较多的话,会导致类比较多,系统变得庞大,命令模式的使用效率可能降低。
/**
* 执行命令的接口
* @description:
* @date 2016-1-19 上午10:26:04
*/
public interface OrderImpl {
void execute();//执行方法
}
/**
* 具体的命令:开空调命令
* @description:
* @date 2016-1-19 上午10:28:18
*/
public class OnOrder implements OrderImpl {
private AirCondition air;
public OnOrder(AirCondition light) {
this.air = light;
}
@Override
public void execute() {
air.open();
}
}
/**
* 具体的命令:关空调命令
* @description:
* @author ldm
* @date 2016-1-19 上午10:28:51
*/
public class OffOrder implements OrderImpl {
private AirCondition light;
public OffOrder(AirCondition light) {
this.light = light;
}
@Override
public void execute() {
light.close();
}
}
/**
* 具体命令:调节风速
* @description:
* @date 2016-1-19 上午11:04:50
*/
public class ChangeSpeedOrder implements OrderImpl {
private AirCondition myTv;
private int channel;
public ChangeSpeedOrder(AirCondition tv, int channel) {
myTv = tv;
this.channel = channel;
}
public void execute() {
myTv.updateWind(channel);
}
}
/**
* 命令控制器,相当于是遥控器:控制空调的开关,调节风速等
* @description:
* @date 2016-1-19 上午10:57:43
*/
public class Control {
private OrderImpl onOrder; // 开
private OrderImpl offOrder;// 关
private OrderImpl updateChannel;// 调节风速
public Control(OrderImpl onOrder, OrderImpl offOrder, OrderImpl updateChannel) {
this.onOrder = onOrder;
this.offOrder = offOrder;
this.updateChannel = updateChannel;
}
public void turnOn() {
onOrder.execute();
}
public void turnOff() {
offOrder.execute();
}
public void changeChannel() {
updateChannel.execute();
}
}
/**
* 命令接收者:空调为例
* @description:
* @date 2016-1-19 上午10:52:38
*/
public class AirCondition {
public int currentChannel = 0;//当前风速档
public void open() {
System.out.println("打开空调!");
}
public void close() {
System.out.println("关闭空调!");
}
public void updateWind(int channel) {
this.currentChannel = channel;
System.out.println("更换空调风速档位:" + channel);
}
}
public class Test {
public static void main(String[] args) {
// 命令接收者 (空调)
AirCondition myAir = new AirCondition();
// 开空调命令
OnOrder on = new OnOrder(myAir);
// 关空调命令
OnOrder off = new OnOrder(myAir);
// 换风速命令
ChangeSpeedOrder speed = new ChangeSpeedOrder(myAir, 2);
// 命令控制对象
Control control = new Control(on, off, speed);
// 开机
control.turnOn();
// 切换频道
control.changeChannel();
// 关机
control.turnOff();
}
}
测试结果:
打开空调!
更换空调风速档位:2
打开空调!