实战java设计模式(十五)命令模式

本文通过一个简单的电灯控制例子介绍了命令模式的应用,展示了如何通过命令模式将指挥者与执行者解耦,使得命令可以被统一管理和执行。在复杂场景下,如多个指挥者并发发送命令且命令执行有延迟时,命令队列的引入能更好地管理这些操作。文章还强调了命令模式的核心角色:命令执行者、命令接口和具体命令,并分析了其关键代码结构。

1 介绍

命令模式实现了指挥者和执行者之间的解耦。可以很好的实现指挥者对执行者的控制。

2 例子

以打开关闭电灯为例子,如果不采用命令模式,直接客户端调用电灯,耦合较大,针对较为复杂的情况如果需要撤销,较为麻烦。在二者之间加一个命令作为桥梁,可以很好的实现解耦,让命令对象去执行执行者的方法。

2.1 电灯实体类

//电灯接收者
class Light{
    //电灯状态
    private boolean lightOn=false;
    //电灯打开
    void on(){
        System.out.println("电灯已经打开");
        this.lightOn=true;
    }
    //电灯关闭
    void off(){
        System.out.println("电灯已经关闭");
        this.lightOn=false;
    }
}

2.2 命令接口

//命令接口
interface Command{
    //执行
    void execute();
}

2.3 实现命令

//打开命令
class LightOnCommand implements Command{
    private Light light;

    //构造函数
    LightOnCommand(Light light){
        this.light=light;
    }

    @Override
    public void execute() {
        this.light.on();
    }
}
//关闭命令
class LightOffCommand implements Command{
    private Light light;

    //构造函数
    LightOffCommand(Light light){
        this.light=light;
    }

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

2.4 测试主类

public class Main {
    public static void main(String[] args) {
        //创建接收者
        Light light=new Light();

        //创建两个命令
        Command on=new LightOnCommand(light);
        Command off=new LightOffCommand(light);

        //调用
        on.execute();
        off.execute();
    }
}

3 例子升华

上述例子比较简单,而且开关几乎是0延迟的情况,所以似乎命令模式的优势没有体现出来。试想这样一个场景,有多个指挥者,且每一个命令执行时间较长,指挥者不停在发命令,这时候使用一个缓存的命令队列就很有必要了,而且都是统一调用execute()方法,非常统一。

4 总结

4.1 核心角色

  • 命令执行者:执行命令的实体类。
  • 命令父类:对于命令的操作,执行、撤销、中断等等。
  • 命令实体:具体的每一项命令,注意要聚合一个命令执行者对象。

4.2 关键代码结构

结构和对象适配器模式相似,都是实现接口聚合目标对象,但是命令模式更加强调能够统一执行,而适配器强调适配某一种。侧重点不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值