命令模式

目录

1.核心思想

2.成员

3.优点

4.代码实现

4.1 命令接口

4.2 接收者

4.3 具体命令

4.4 调用者

4.5 客户端


1.核心思想

将请求或操作封装成一个对象,从而使得可以参数化 clients 希望执行的操作。

2.成员

命令(Command)

命令对象封装了请求的信息,通常包括调用操作的对象(接收者)、方法名、参数等。

接口或抽象类定义了执行操作的方法 execute()

具体命令(Concrete Command)

实现了命令接口,负责调用接收者并执行请求。

将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现 execute() 方法。

调用者(Invoker)

负责调用命令对象来执行请求。

不直接执行请求的操作,而是通过命令对象来间接调用。

接收者(Receiver)

知道如何实施与执行一个请求相关的操作。

任何类都可能作为一个接收者。

客户端(Client)

创建具体命令对象并设置其接收者。

将命令对象传递给调用者以执行请求。

3.优点

解耦

命令模式将调用操作的对象(调用者)与知道如何实现操作的对象(接收者)解耦。调用者只需知道如何调用命令对象即可,无需了解命令的具体实现细节。

这种解耦允许我们更容易地对系统进行修改和扩展,例如可以添加新的命令而无需修改已有的调用者代码。

增强灵活性

命令模式使得可以将命令对象参数化,也就是说可以用不同的命令对象来进行请求。这样可以很容易地实现将命令排队、记录请求日志、撤销操作等功能。

由于命令对象本身就是一个对象,因此可以存储在数据结构中、作为参数传递给方法,甚至可以动态创建和销毁命令对象。

支持撤销和恢复操作

命令对象通常会存储执行操作所需的状态,这使得实现撤销操作变得相对容易。通过实现一个 undo() 方法,可以回退到之前的状态或操作。

简化代码

命令模式可以将复杂的操作封装到一个简单的接口中。这样,调用者不需要知道复杂的实现细节,从而简化了调用者的代码逻辑。

更容易设计复杂的系统架构

命令模式可以作为构建更大型的系统架构的基础。通过将系统操作封装成命令对象,可以更容易地设计和实现复杂的系统功能和功能组合。

4.代码实现

4.1 命令接口

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

4.2 接收者

//接收者
public class Light {
    public void turnOn() {
        System.out.println("灯打开了");
    }

    public void turnOff() {
        System.out.println("灯关闭了");
    }
}

4.3 具体命令

//具体命运类 开灯
public class TurnOnCommand implements Command{
    private Light light;

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

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

//具体命运类 关灯
public class TurnOffCommand implements Command{
    private Light light;

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

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

4.4 调用者

//调用者 开关
public class Switch {
    private TurnOnCommand turnOnCommand;
    private TurnOffCommand turnOffCommand;

    public Switch(TurnOnCommand turnOnCommand,TurnOffCommand turnOffCommand)  {
        this.turnOffCommand = turnOffCommand;
        this.turnOnCommand = turnOnCommand;
    }

    public void turnOn() {
        turnOnCommand.execute();
    }

    public void turnOff() {
        turnOffCommand.execute();
    }
}

4.5 客户端

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

        //创建命令对象,设定它的接收者
        TurnOnCommand turnOnCommand = new TurnOnCommand(light);
        TurnOffCommand turnOffCommand = new TurnOffCommand(light);

        // 创建调用者并指定命令
        Switch switcher = new Switch(turnOnCommand,turnOffCommand);
        // 执行开灯命令
        switcher.turnOn();
        // 执行关灯命令
        switcher.turnOff();
    }
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值