1、例子
1)
我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装
app
就
可以控制对这些家电工作。
2)
这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个
App
,分别控制,我
们希望只要一个
app
就可以控制全部智能家电。
3)
要实现一个
app
控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口
给
app
调用,这时 就可以考虑使用命令模式。
4)
命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来
.
5)
在我们的例子中,动作的请求者是手机
app
,动作的执行者是每个厂商的一个家电产品
命令模
基本定义:
在软件设计中,我们经常需要
向某些对象发送请求,但是并不知道请求的接收者是谁,也不知
道被请求的操作是哪个,
1) 我们只需在程序运行时指定具体的请求接收者即可,此时,可以
使用命令模式来进行设计
2)
命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让
对象之间的调用关系更加灵活,实现解耦。
3)
在命名模式中,会将一个请求封装为一个对象,以便使用不同参
数来表示不同的请求
(
即命名
)
,同时命令模式也支持可撤销的操作。
有点类似消息的广播模式
3、代码
public class RemoteController {
//开 按钮的命令数组
Command[] onCommands;
Command[] offComands;
//执行撤销的命令
Command undoCommand;
//构造器,完成对按钮的初始化
public RemoteController() {
onCommands=new Command[5];
offComands=new Command[5];
for (int i = 0; i < 5; i++) {
onCommands[i]=new NoCommand();
offComands[i]=new NoCommand();
}
}
//给我们的按钮设置你需要的命令
public void setCommand(int no,Command onCommand,Command offComand){
onCommands[no]=onCommand;
offComands[no]=offComand;
}
//按下开按钮
public void onButtonWasPushed(int no){
onCommands[no].execute();
undoCommand=onCommands[no];
}
//按下开按钮
public void offButtonWasPushed(int no){
offComands[no].execute();
undoCommand=offComands[no];
}
//按下撤销按钮
public void undoButtonWasPushed(){
undoCommand.undo();
}
}
public class LightOnCommand implements Command {
//聚合LightReceiver
LightReceiver light;
//构造器
public LightOnCommand(LightReceiver light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
@Override
public void undo() {
light.off();
}
}
public class LightOffCommand implements Command {
//聚合LightReceiver
LightReceiver light;
//构造器
public LightOffCommand(LightReceiver light) {
this.light = light;
}
@Override
public void execute() {
light.off();
}
@Override
public void undo() {
light.on();
}
}
public interface Command {
public void execute();
public void undo();
}
public class LightReceiver {
public void on(){
System.out.println("电灯打开了");
}
public void off(){
System.out.println("电灯关闭了");
}
}
public class Client {
public static void main(String[] args) {
LightReceiver lightReceiver = new LightReceiver();
LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
RemoteController remoteController = new RemoteController();
remoteController.setCommand(0,lightOnCommand,lightOffCommand);
System.out.println("开始");
remoteController.onButtonWasPushed(0);
System.out.println("关闭");
remoteController.offButtonWasPushed(0);
System.out.println("撤销");
remoteController.undoButtonWasPushed();
System.out.println("___________________");
TVReceiver tvReceiver = new TVReceiver();
TVOffCommand tvOffCommand = new TVOffCommand(tvReceiver);
TVOnCommand tvOnCommand = new TVOnCommand(tvReceiver);
remoteController.setCommand(1,tvOnCommand,tvOffCommand);
System.out.println("开始");
remoteController.onButtonWasPushed(1);
System.out.println("关闭");
remoteController.offButtonWasPushed(1);
System.out.println("撤销");
remoteController.undoButtonWasPushed();
}
}
总结:把逻辑流程抽象,底部实现类,改为插拔式