命令模式-《Head First 设计模式》第六章

本文详细介绍了命令模式的概念、结构和应用场景,包括如何实现可撤销操作和宏命令,以及命令模式在队列请求和日志请求中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命令模式

一、定义

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

二、结构

客户、命令、接受命令执行者、被命令对象

  • 命令:Command接口及具体命令对象(open、close、undo),调用被命令对象的具体方法。
  • 被命令对象:Light灯具等设备,包含open、close等具体操作方法。
  • Invoker(接受命令执行者):设置命令,并且执行者,包含setCommand、execute和undo方法。

实例:灯具、门设备开关

Device设备
//灯具
public class Light {
    public void on() {
        System.out.println("Light on");
    }
    public void off() {
        System.out.println("Light off");
    }
}
//车库门
public class GarageDoor {
    public void open() {
        System.out.println("GarageDoor open");
    }
    public void close() {
        System.out.println("GarageDoor close");
    }
}
Command命令
public interface Command {
    public void execute();
    public void undo();
}
//灯具开启命令(关闭类似)
public class LightOnCommand implements Command{
    Light light;
    public LightOnCommand(Light light) {
        this.light = light;
    }
    public void execute() {
        light.on();
    }
    public void undo() {
        light.off();
    }
}
//车库门开启命令(关闭类似)
public class GarageDoorOpenCommand implements Command{
    GarageDoor door;
    public GarageDoorOpenCommand(GarageDoor door) {
        this.door = door;
    }
    public void execute() {
        door.open();
    }
    public void undo() {
        door.close();       
    }
}
//空命令
public class UnCommand implements Command{
    public void execute() { 
    }
    public void undo() {
    }
}
Invoker调用者
//简单遥控器
public class SimpleRemoteControl {
    Command slot;
    Command undoCommand;
    public void setCommand(Command command) {
        slot = command;
    }
    public void buttonWasPressed() {
        slot.execute();
        undoCommand = slot;
    }
    public void undoButtonWasPressed() {
        undoCommand.undo();
    }
}
Client客户
public class SimpleClient {

    public static void main(String[] args) {
        // 灯具开启
        SimpleRemoteControl simpleRemoteControl = new SimpleRemoteControl();
        simpleRemoteControl.setCommand(new LightOnCommand(new Light()));
        simpleRemoteControl.buttonWasPressed();
        // 车库门开启
        simpleRemoteControl.setCommand(new GarageDoorOpenCommand(new GarageDoor()));
        simpleRemoteControl.buttonWasPressed();
        //撤销上一个命令
        simpleRemoteControl.undoButtonWasPressed();
    }

}

三、撤销和宏命令

撤销操作可以使用栈记录执行过的命令,在undo时以此取出栈顶命令,并且执行其undo方法。
宏命令就是用数组记录所有命令,并且遍历执行。

四、命令的更多用途

1、队列请求

将命令接口的对象,放入队列中,在线程可用时,从队列取出命令并且执行execute。在这种情况下,命令模式是非常好用的。

2、日志请求

电子表格等文件,需要将操作存储在硬盘中,当出现死机之后,从硬盘中获取之前的操作并且恢复。而不是采用每次操作都将整个电子表格等数据都存储一边。

模式的形式:
1、每次执行操作,都通过invoker(接受命令并且执行者)调用execute将数据存储(store)到硬盘中
2、出现死机,开始进行恢复
3、通过invoker调用execute将数据从硬盘中加载出来(load)

这样就满足了日志的需求。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值