设计模式之命令模式


前言

大家好,我是练习两年半的Java练习生,最近阅读了《深入浅出设计模式(中文版)》,学习了各种设计模式,所以想出一个专栏和大家分享一下!
如果大家觉得文章还可以,欢迎关注点赞!后续还会陆续更新!!


一、定义

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

二、类图

image.png

三、应用

3.1 需求

设计一个控制器,可以有几个按钮,并控制家里的各种不同的设备。(代码中为了方便只实现了一个按钮,同理,可以自行添加)。

3.2 分析

根据上面命令模式的类图,我们应该知道一个遥控器上面有很多的按钮,每个按钮对应的应该是一个命令的具体类,这个命令具体类知道如何让接收者进行必要的工作,同时,也提供了撤销该命令的方法。

3.3 实现

//定义一个命令接口,含有execute() 和 undo()方法
public interface Command {
    void execute();
    void undo();
}
//具体的设备,应该知道怎么处理
public class Light {
    public void on(){
        System.out.println("开灯");
    }
    public void off(){
        System.out.println("关灯");
    }
}
//具体的控制器,有开灯控制器、关灯控制器,可以实现undo操作
public class LightOffCommand implements Command{
    Light light;

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

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

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

//
public class LightOnCommand implements Command{
    Light light;

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

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

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

public class NoCommand  implements Command{

    @Override
    public void execute() {
        System.out.println("什么都不做,避免用null判断");
    }

    @Override
    public void undo() {

    }
}
//遥控器,用于控制设备
public class SimpleRemoteControl {
    Command slot;

    public void setSlot(Command slot) {
        this.slot = slot;
    }

    public void buttonWasPressed(){
        slot.execute();
    }
}

// 用户使用时必须设置遥控器按钮
public class RemoteTest {
    public static void main(String[] args) {
        SimpleRemoteControl simpleRemoteControl = new SimpleRemoteControl();
        Light light = new Light();
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        simpleRemoteControl.setSlot(lightOnCommand);
        simpleRemoteControl.buttonWasPressed();
    }
}

四、问题

如何利用命令模式实现日志记录?

命令模式在java线程池在怎么使用?

命令模式对比观察者模式?

命令模式和观察者模式是两种不同的设计模式,它们的主要区别在于它们的目的和应用场景不同。
命令模式的目的是将请求封装为对象,从而使得请求的发送者和接收者解耦,实现了请求的发送者和接收者之间的松耦合关系。命令模式主要用于支持撤销操作、队列请求等功能,常常用于实现菜单、工具条、按钮等界面元素的事件处理。
而观察者模式的目的是在对象之间建立一对多的依赖关系,使得当一个对象状态改变时,所有依赖于它的对象都能够得到通知并自动更新。观察者模式主要用于实现事件处理、消息传递、状态同步等功能。
因此,命令模式和观察者模式的应用场景和目的不同,虽然它们都涉及到对象之间的通信,但是命令模式更注重请求的发送者和接收者之间的解耦,而观察者模式更注重对象之间的状态同步。


五、总结

以上就是今天要讲的内容,本文介绍了设计模式中的命令模式,其实这个模式在开发中是用得很多的一个模式,比如说线程池的实现,就是将一个个具体的命令对象封装成FutureTask对象,交给对应的线程池去调用。从而实现请求的发送者和接收者解耦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值