首页 > 其他分享 >命令模式

命令模式

时间:2024-09-17 15:13:21浏览次数:1  
标签:execute light void 模式 命令 Command public

命令模式

命令模式(Command Pattern)是行为型设计模式之一,它将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,以及对请求排队或记录请求日志等操作。通过使用命令模式,命令的发出者与命令的执行者可以完全解耦。

命令模式的结构

  1. Command(命令接口/抽象类):定义了执行命令的方法,例如 execute()
  2. ConcreteCommand(具体命令类):实现了 Command 接口,具体实现了命令的执行逻辑。通常会持有对接收者对象的引用,并在 execute() 方法中调用接收者的相关操作。
  3. Receiver(接收者类):执行与请求相关的操作。每个具体命令将接收者对象的动作封装为命令。
  4. Invoker(调用者类):持有命令对象,并在某个时间点触发命令的执行。调用者通常不直接与接收者交互,而是通过命令对象来完成具体的操作。
  5. Client(客户端):创建命令对象并设定其接收者。客户端可以通过调用者来触发命令的执行。

示例

举个简单的例子,假设有一个遥控器可以控制灯的开关:

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

// Receiver 接收者类
public class Light {
    public void turnOn() {
        System.out.println("Light is ON");
    }
    
    public void turnOff() {
        System.out.println("Light is OFF");
    }
}

// 具体命令类 - 打开灯
public class LightOnCommand implements Command {
    private Light light;

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

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

// 具体命令类 - 关闭灯
public class LightOffCommand implements Command {
    private Light light;

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

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

// Invoker 调用者类
public class RemoteControl {
    private Command command;

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

    public void pressButton() {
        if (command != null) {
            command.execute();
        }
    }
}
// Client 客户端代码
public class Client {
    public static void main(String[] args) {
        Light light = new Light();  // 创建接收者对象
        
        // 创建命令对象
        Command lightOn = new LightOnCommand(light);
        Command lightOff = new LightOffCommand(light);

        RemoteControl remote = new RemoteControl();  // 创建调用者对象
        
        // 打开灯
        remote.setCommand(lightOn);
        remote.pressButton();
        
        // 关闭灯
        remote.setCommand(lightOff);
        remote.pressButton();
    }
}


代码说明

  1. 命令接口 (Command):定义了一个execute()方法,所有命令都要实现这个接口。
  2. 接收者 (Light):包含实际执行操作的方法,比如turnOn()turnOff()
  3. 具体命令类 (LightOnCommand, LightOffCommand):每个具体命令类实现Command接口,并持有对接收者对象的引用。在execute()方法中调用接收者的具体操作。
  4. 调用者 (RemoteControl):调用者不直接与接收者交互,而是通过命令对象来间接操作。它持有命令对象,并在适当的时候调用execute()方法。
  5. 客户端 (Client):负责创建接收者、具体命令对象,并将命令对象传递给调用者。

命令模式的扩展

1. 撤销操作

要实现撤销操作,可以在命令类中增加undo()方法,并记录上一次执行的状态。例如:

java复制代码public interface Command {
    void execute();
    void undo();  // 撤销操作
}

在具体命令类中实现undo()方法:

public class LightOnCommand implements Command {
    private Light light;

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

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

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

2. 宏命令

宏命令是一组命令的组合,可以一次性执行多个命令。可以创建一个MacroCommand类来存储并执行多个命令:

import java.util.ArrayList;
import java.util.List;

public class MacroCommand implements Command {
    private List<Command> commands = new ArrayList<>();

    public void addCommand(Command command) {
        commands.add(command);
    }

    @Override
    public void execute() {
        for (Command command : commands) {
            command.execute();
        }
    }

    @Override
    public void undo() {
        for (Command command : commands) {
            command.undo();
        }
    }
}

标签:execute,light,void,模式,命令,Command,public
From: https://www.cnblogs.com/20lxj666/p/18396294

相关文章

  • 责任链模式
    责任链模式责任链模式(ChainofResponsibilityPattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这个模式将请求的处理者连接成一条链,沿着这条链传递请求,直到某个处理者处理它为止。责任链模式的主要角色:抽象处理者(Handler):定......
  • Redis 常用命令
    Redis常用命令转载:Redis键(key)|菜鸟教程(runoob.com)键操作命令描述SETkeyvalue将字符串值存储在指定的键中。如果键已经存在,则覆盖旧值。GETkey获取指定键的值。DELkey删除指定的键。如果键不存在,忽略操作。EXISTSkey检查指定的键是否存在,返......
  • 简单工厂模式
    简单工厂模式简单工厂模式(SimpleFactoryPattern)是一种创建型设计模式,通过一个工厂类来决定实例化哪一个类的对象。它是最常见的设计模式之一,主要用于将对象的创建与使用分离,减少代码重复,提高代码的可维护性。特点工厂角色:负责创建具体产品类的实例,通常是一个包含静态方法的......
  • 单列模式
    单列模式“单例模式(SingletonPattern),用于确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这个模式在需要控制资源的访问或者确保某些操作只有一个实例时使用。单例模式的特点唯一性:保证一个类只有一个实例。全局访问:提供一个全局的访问点来获取这个实例。延迟......
  • 23种设计模式
    23种设计模式设计模式是软件工程中用于解决特定问题的通用解决方案。常见的设计模式有24种,通常分为三大类:创建型、结构型和行为型。下面是对这24种设计模式的详细解释及其归类:1.创建型模式1.1单例模式(Singleton)目的:确保一个类只有一个实例,并提供一个全局访问点。适用场......
  • 适配器模式
    适配器模式适配器模式(AdapterPattern)是一种结构型设计模式,用于解决接口不兼容的问题。它的主要作用是将一个类的接口转换成客户端期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以一起工作。概念目标接口(Target):客户端期望使用的接口。源接口(Adaptee):需要被......
  • 原型模式
    原型模式原型模式(PrototypePattern)是一种创建型设计模式,其主要目的是通过复制现有的对象来创建新的对象,而不是通过构造函数进行实例化。这个模式的核心思想是“克隆”现有对象,以获得新的实例,尤其是在创建成本较高的情况下非常有用。原型模式通常涉及以下几个角色:原型(Prototyp......
  • 建造者模式
    建造者模式建造者模式(BuilderPattern)是一种创建型设计模式,它用于分步骤地创建复杂对象,而无需直接调用构造函数。通过将对象的构建过程与其表示(即对象内部细节的实现)分离,建造者模式允许创建不同的对象表示,同时保持构造过程的一致性。特点分步骤创建:建造者模式将对象的创建过程......
  • 抽象工厂模式
    抽象工厂模式抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们的具体类。抽象工厂模式常用于需要创建一组相关或依赖对象的场景,确保这些对象在不同的环境中可以协同工作。特点抽象工厂:定义了一组创......
  • 享元模式
    享元模式(FlyweightPattern)是一种结构型设计模式,旨在通过共享大量细粒度对象来减少内存使用。它在需要创建大量相似对象的场景中尤其有用,通过共享对象来降低内存开销,从而提高性能。核心思想享元模式将对象的状态分为两部分:内部状态(IntrinsicState):不随外部环境改变,可以共享的......