设计模式——命令模式(Command)

在面向对象程序设计的范畴中,命令模式(Command Pattern)是一种设计模式,它尝试以对象来代表实际行动。具体来说,命令模式将一个请求封装为一个对象,从而使你可以使用不同的请求对客户进行参数化,对请求进行排队或记录请求日志,以及支持可撤销操作。

命令模式的结构主要包括以下几个部分:

  1. Command:定义命令的接口,声明执行的方法。
  2. ConcreteCommand:命令接口实现对象,是"虚"的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
  3. Receiver:接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
  4. Invoker:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这是客户端真正触发命令并要求命令执行相应操作的地方。
  5. Client:创建具体的命令对象,并且设置命令对象的接收者。

命令模式的优点包括:

  • 降低对象之间的耦合度。
  • 新的命令可以很容易地加入到系统中。
  • 可以比较容易地设计一个组合命令。
  • 调用同一方法实现不同的功能。

命令模式的应用场景包括:

  • 多级回退操作:如果系统需要实现多级回退操作,所有用户的操作都以command对象的形式实现,系统可以简单地用stack来保存最近执行的命令,用户需要执行undo操作时,系统只需简单地弹出一个最近的command对象并执行其undo()方法。
  • 原子事务行为:借助command模式,可以简单地实现一个具有原子事务的行为。当一个事务失败时,可以借助command对象保存状态,简单地处理回退操作。
  • 导航:在一个复杂的用户界面中,通常需要使用多个wizard页面来共同完成一个简单动作。在这种情况下,command类不包含任何跟用户界面有关的代码,可以分离用户界面与具体的处理逻辑。

当使用命令模式时,通常会涉及多个类和接口。下面是一个简单的命令模式的代码示例,用于演示其基本结构和用法。

java 复制代码
// Command 接口
public interface Command {
    void execute();
    void undo();
}

// Receiver 类
public class Receiver {
    public void action() {
        System.out.println("Action performed on receiver.");
    }

    public void undoAction() {
        System.out.println("Undo action performed on receiver.");
    }
}

// ConcreteCommand 类
public class ConcreteCommand implements Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.action();
    }

    @Override
    public void undo() {
        receiver.undoAction();
    }
}

// Invoker 类
public class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

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

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

// Client 类
public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);

        Invoker invoker = new Invoker();
        invoker.setCommand(command);

        // 执行命令
        invoker.executeCommand();

        // 撤销命令
        invoker.undoCommand();
    }
}

在这个例子中,Command 是一个接口,定义了 executeundo 方法。Receiver 是接收者,包含了需要执行的操作和撤销操作的方法。ConcreteCommandCommand 接口的具体实现,它持有一个 Receiver 对象,并在 executeundo 方法中调用该对象的相应方法。Invoker 是请求者,它持有一个 Command 对象,并提供了执行和撤销命令的方法。最后,Client 是客户端,它创建了 ReceiverConcreteCommandInvoker 对象,并设置了 Invoker 的命令,然后执行和撤销该命令。

运行 Client 类的 main 方法,你将看到类似下面的输出:

复制代码
Action performed on receiver.
Undo action performed on receiver.

这表示命令已成功执行并被撤销。

相关推荐
YGGP4 小时前
【结构型模式】代理模式
设计模式
庄小焱9 小时前
设计模式——中介者设计模式(行为型)
设计模式
庄小焱11 小时前
设计模式——备忘录设计模式(行为型)
设计模式
庄小焱11 小时前
设计模式——代理设计模式(结构型)
设计模式
哆啦A梦的口袋呀12 小时前
基于Python学习《Head First设计模式》第三章 装饰者模式
python·学习·设计模式
哆啦A梦的口袋呀12 小时前
基于Python学习《Head First设计模式》第五章 单件模式
python·学习·设计模式
季鸢13 小时前
Java设计模式之备忘录模式详解
java·设计模式·备忘录模式
摘星编程16 小时前
工厂方法模式深度解析:从原理到应用实战
java·设计模式·软件工程·工厂方法模式
何中应17 小时前
【设计模式-4.7】行为型——备忘录模式
java·设计模式·备忘录模式
suixinger_lmh1 天前
功能结构整理
unity·设计模式·c#·源代码管理