设计模式学习笔记——命令模式

设计目的

将”动作的请求者”和”动作的执行者”解耦,甚至他们互相不知道对方的存在。

实现方法

设计一个接口,该接口声明了一些方法(execute/undo),所有的命令都实现了该接口,并以该接口为类型在各类中进行传递,“动作的执行者”只要知道它实现了该接口,就可以调用该命令的方法。

命令模式

将请求封装成对象,这可以让你使用不同的请求、队列、或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。
若想撤销多步,则可以使用一个堆栈来记录命令,执行命令的撤销方法即可。

参考示例

1、命令接口

public interface Command {
    public void execute();
    public void undo();
}

2、具体命令类

public class LightOnCommand implements Command {
    /**
     * 持有一个具体对象的引用
     */
    Light light;

    /**
     * 构造
     *
     * @param light 设置对象
     */
    public LightOnCommand(Light light) {
        this.light = light;
    }

    /**
     * 执行该命令
     */
    @Override
    public void execute() {
        light.on();
    }

    @Override
    public void undo() {
        light.off();
    }
}
public class LightOffCommand implements Command {
    /**
     * 持有一个具体对象的引用
     */
    Light light;

    /**
     * 构造
     *
     * @param light 设置对象
     */
    public LightOffCommand(Light light) {
        this.light = light;
    }

    /**
     * 执行该命令
     */
    @Override
    public void execute() {
        light.off();
    }

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

3、实体类

public class Light {
    String description;

    public Light(String description) {
        this.description = description;
    }

    /**
     * 具体操作
     */
    public void on() {
        System.out.println("打开" + description + "电灯");
    }

    /**
     * 具体操作
     */
    public void off() {
        System.out.println("关闭" + description + "电灯");
    }
}
public class SimpleRemoteControl {
    /**
     * 命令
     */
    Command slot;

    public SimpleRemoteControl() {
    }

    /**
     * 设置命令
     *
     * @param command 具体的命令类,实现了Command接口
     */
    public void setCommand(Command command) {
        slot = command;
    }

    /**
     * 执行该命令
     */
    public void buttonWasPressed() {
        slot.execute();
    }
}

4、测试类

public class SimpleRemoteControlTest {
    public static void main(String[] args){
        SimpleRemoteControl remote = new SimpleRemoteControl();
        Light light = new Light("厨房");
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);
        remote.setCommand(lightOnCommand);
        remote.buttonWasPressed();
        remote.setCommand(lightOffCommand);
        remote.buttonWasPressed();
    }
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值