java设计模式——命令模式



一、什么情况下考虑使用“命令设计模式”?

                 当我们考虑的场景中需要“动作的请求者”与“动作的执行者”之间解耦,也就是说动作的发起端不必知道动作是如何执行的,只需要下达“命令”就可以执行相应的动作,相当于把方法的调用也封装了起来,只需要对“命令对象”调用统一的方法,然而“命令对象”会知道如何执行相应的方法。

        命令模式中的一些概念:        

        命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也只支持可撤销的操作。

        命令对象:将动作以及接收者包装成一个对象,只对外暴露一个特定的方法,当这一特定方法被调用时,接收者就会执行相应的动作。

 

二、如何是实现“命令设计模式”?

       考虑如下场景:需要我们设计一个遥控器,上面有两个按钮,按下时分别为打开电灯,关闭电灯(当然也可以换为开关风扇等等)。此时我们可以考虑使用命令模式。

      ①我们让所有的命令对象实现命令接口:

public interface Command {
    public void execute();
}

     ②建立对应的命令对象:

     针对已存在的对象Light建立命令对象

public class Light {
    public void on(){
        System.out.println("Light is on");
    }

    public void off(){
        System.out.println("light is off");
    }
}

    打开电灯命令对象(构造函数可以设置具体的对象):

public class LightOnCommand implements Command {
    Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.on();
    }
}

   关闭电灯命令对象:

  

public class LightOffCommand implements Command {
    Light light;

    public LightOffCommand(Light light){
        this.light = light;
    }

    @Override
    public void execute() {
        light.off();
    }
}

   ③建立动作“请求者”——遥控器

   

public class SimpleRemoteControl {
    Command onCommand;
    Command offCommad;

    public void setOnCommand(Command onCommand) {
        this.onCommand = onCommand;
    }

    public void setOffCommad(Command offCommad) {
        this.offCommad = offCommad;
    }

    public void onButtonWasPressed(){
        onCommand.execute();
    }
    public void offButtonWasPressed(){
        offCommad.execute();
    }
}

  ④为遥控器初始化相应的开关灯的命令。

public class RemoteControlTest {
    public static void main(String[] args) {
        SimpleRemoteControl remoteControl = new SimpleRemoteControl();
        Light light = new Light();
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);

        remoteControl.setOnCommand(lightOnCommand);
        remoteControl.setOffCommad(lightOffCommand);

        remoteControl.onButtonWasPressed();
        remoteControl.offButtonWasPressed();

    }
}

   
三、命令模式的其他应用:

         上面只是最简单的命令模式,我们可以使用宏命令,即为动作的执行为多个命令对象的集合,我们可以让灯闪烁,只要循环执行LightOnCommad与LightOffCommand即可。

         我们可以建立一个命令对象的队列,只需要不断的取出命令对象一个一个执行,这样就可已建立一个日程安排了。命令模式还可以用于线程池、工作队列,事务处理等等。
 

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值