在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式
命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递
我们对电视机有不同的操作。
抽象一个请求操作:
public interface Command{
void execute();
}
接受请求的对象:
public class WatchTV{
public int currentChannel = 0;
public void turnOn(){
System.out.println("打开电视");
}
public void turnOff(){
System.out.println("关闭电视");
}
public void change(int channel){
this.currentChanel = channel;
System.out.println("正在收看"+this.currentChanel +"频道");
}
}
发出请求对象(打开电视):
public class CommandOn implements Command{
private WatchTV tv;
public CommandOn(WatchTv tv){
this.tv = tv;
}
public void execute(){
tv.turnOn();
}
}
发出请求对象(关闭电视):
public class CommandOff implements Command{
private WatchTV tv;
public CommandOn(WatchTv tv){
this.tv = tv;
}
public void execute(){
tv.turnOff();
}
}
操作对象(遥控器):
public class Control{
private Command commandOn;
private Command commandOff;
private Command commandChange;
public Control(CommandOn on ,.....){
this.commandOn = on;
this.commandOff = off;
this.commandChange = change;
}
public void trunOn(){
commandOn.execute();
}
public void trunOff(){
commandOff.execute();
}
public void change(){
commandChange.execute();
}
}
客户使用遥控器的时候:
main(){
WatchTV myTv = new WatchTV();
Command on = new CommandOn(myTv);
Command off = new CommandOff(myTv);
Control control = new Control(on,off,change);
control.turnOn();
control.turnOff();
control.change();
}
你会发现 通过 不同类之间的耦合调用,使得,用户不需要去直接命令电视,而是通过遥控器去,发送命令,然后电视才去执行。中间分好多层。
请求一方。和 操作一方独立开。
关键,在于引入 命令 抽象接口。只有实现这个接口,才能和接受者关联。。。如果电视不接受 某个遥控器的命令 也是无法操作的。