命令模式

某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象实现二者之间的松耦合。这就是命令模式


命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开


命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递

我们对电视机有不同的操作。

抽象一个请求操作:

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();

}


你会发现 通过 不同类之间的耦合调用,使得,用户不需要去直接命令电视,而是通过遥控器去,发送命令,然后电视才去执行。中间分好多层。

请求一方。和 操作一方独立开。

关键,在于引入 命令 抽象接口。只有实现这个接口,才能和接受者关联。。。如果电视不接受 某个遥控器的命令 也是无法操作的。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值