本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
23种设计模式之命令模式(Command Pattern)
iamgeek · 127浏览 · 发布于2023-06-30 +关注

命令模式概念

命令模式(Command Pattern)是一种行为型设计模式,它将请求或操作封装成一个对象,从而使不同的请求可以被异步、延迟、排队,或者记录下来以备撤销或重做等操作。命令模式可以将客户端和接收者解耦,提高系统的灵活性与可扩展性。

命令模式角色

命令模式包含如下几个主要角色:

命令(Command):定义了执行操作的接口,包含了执行该命令所需的所有必要信息。

具体命令(Concrete Command):实现了命令接口,它包含了一个接收者对象,并完成具体的命令操作。

接收者(Receiver):执行命令的对象,真正的命令执行者。

调用者(Invoker):发出命令并要求执行命令的对象,通常会持有命令对象,并通过命令对象来执行具体的操作。

客户端(Client):创建具体的命令对象,并将其设置到调用者中,然后发起调用者的请求。

命令模式注意事项

在使用命令模式时,需要注意以下几点:

尽量将每个命令实现为一个独立的类,这样可以方便地扩展新的命令类型。

命令对象可以被序列化,并且命令队列支持保存和恢复操作,从而可以实现日志记录、撤销和重做等功能。

可以使用组合模式将命令组合成宏命令,从而可以批量执行多个命令。

在有些场景下,可以使用命令模式来代替回调函数(callback),从而避免回调函数带来的复杂度和耦合性。

命令模式案例

接下来通过一个案例来学习命令模式,此案例展示了如何使用命令模式将请求封装成对象,并实现撤销操作:

// 定义命令接口
interface Command {
    void execute();
    void undo();
}

// 实现具体命令对象
class LightOnCommand implements Command {
    private final Light light;
    private boolean lastState;

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

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

    @Override
    public void undo() {
        if (lastState) {
            light.turnOn();
        } else {
            light.turnOff();
        }
    }
}

// 实现接收者对象
class Light {
    private boolean isOn = false;

    public boolean isOn() {
        return isOn;
    }

    public void turnOn() {
        isOn = true;
        System.out.println("Light is on");
    }

    public void turnOff() {
        isOn = false;
        System.out.println("Light is off");
    }
}

// 实现调用者对象
class RemoteControl {
    private final Command command;

    public RemoteControl(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }

    public void pressUndo() {
        command.undo();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建接收者对象
        Light light = new Light();

        // 创建具体命令对象
        LightOnCommand onCommand = new LightOnCommand(light);

        // 创建调用者对象,并设置命令对象
        RemoteControl remoteControl = new RemoteControl(onCommand);

        // 发起请求
        remoteControl.pressButton();

        // 撤销请求
        remoteControl.pressUndo();
    }
}

在上面的示例代码中,我们使用命令模式将打开电灯的操作封装成了一个命令对象 LightOnCommand,并通过调用者对象 RemoteControl 来发起请求。客户端可以根据需要创建不同的命令对象,并将其设置到调用者对象中,然后通过调用调用者对象的方法来执行具体的命令操作。

命令模式还支持命令队列、宏命令和日志记录等高级特性,可以根据具体的场景选择适合的方式来使用命令模式。

命令模式小结

命令模式(Command Pattern)是一种优秀的行为型设计模式,它将一个请求封装成一个对象,从而使得请求发起者与请求接收者解耦,并可支持撤销、重做等功能。通过使用命令模式,可以极大地提高代码复用性、灵活性和可扩展性。




相关推荐

PHP实现部分字符隐藏

沙雕mars · 1325浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 908浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 970浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 963浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1086浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
努力追求卓越,极致,这么一个GEEK人,希望可以跟大家认识,交流一下。
分类专栏
小鸟云服务器
扫码进入手机网页