命令模式(Command Pattern)

命令模式(Command Pattern)

定义

命令模式是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。
命令模式解耦了请求方和接收方,请求方只需请求执行命令,不用关心命令是怎样被接收,怎样被操作以及是否被执行等。

命令模式是将请求封装成一个对象,这样可以使用不同的请求参数化其他对象(依赖注入),并且能够支持请求的排队执行、记录日志、撤销等功能。

本质:解耦命令请求与处理。

属于行为型模式。

适用场景

命令模式的适用场景
1.实现语义中的“命令”的操作(如命令菜单,shell命令)
2.请求调用者和请求的接收者需要解耦,使得调用者和接收者不直接交互。
3.需要抽象出等待执行的行为,比如撤销(undo)和恢复(redo)等操作。
4.需要支持命令宏(及命令组合操作)

标准示例

在这里插入图片描述

ICommand 命令接口;
ConcreteCommand 具体命令实现类;
Invoker 调用类,构造方法入参为 ICommand,它的execute方法,实际调用的是传入对象的 cmd.execute()
Receiver 接收类,只有一个方法action
调用类和接收类通过ConcreteCommand 实现了解耦。

具体代码如下:

//命令接口
public interface ICommand {
    void execute();
}
//具体命令接口
public class ConcreteCommand implements ICommand{

    //每个命令对应一个不同的receiver
    private Receiver receiver = new Receiver();

    @Override
    public void execute() {
        receiver.action();
    }
}
/**
 * 调用者
 */
public class Invoker {
    private ICommand cmd;

    public Invoker(ICommand cmd){
        this.cmd = cmd;
    }

    public void execute(){
        this.cmd.execute();
    }
}
/**
 * 接收者
 */
public class Receiver {
    public void action(){
        System.out.println("执行动作");
    }
}
public class ClientTest {
    public static void main(String[] args) {
        ICommand cmd = new ConcreteCommand();
        Invoker invoker = new Invoker(cmd);
        invoker.execute();
    }
}

生活中也有很多命令模式的例子。
比如遥控器:它把我们的请求和设备的执行做了解耦,将请求和执行做了分离。
比如餐厅点菜单:客人按照菜单点菜,后厨根据菜单配菜做菜,菜单就是个解耦的介质,将请求和执行做了解耦,可以达到灵活扩展的目的。
下面举个智能空调的例子:

现在的空调,都支持APP操控了。这必然就涉及到 设备与服务器 的交互。
我们现在定义2个接口:
设备注册设备心跳上送

我们使用命令模式来实现这四个接口。
相应的类为:
ICommandAbstractCommand
RegistCommandHeartbeatCommand
Invoker
Receiver


ICommand

public interface ICommand {
    void execute();
}

AbstractCommand

public abstract class AbstractCommand implements ICommand {
    protected Receiver receiver = new Receiver();
}

RegistCommand

public class RegistCommand extends AbstractCommand {
    public void execute() {
        receiver.registAction();
    }
}
public class HeartbeatCommand extends AbstractCommand {
    public void execute() {
        receiver.heartbeatAction();
    }
}

Receiver

public class Receiver {
    public void registAction(){
        System.out.println("regist ...");
    }
    public void heartbeatAction(){
        System.out.println("heartbeat ...");
    }
}

Invoker

public class Invoker {
    public void execute(ICommand command){
        command.execute();
    }
}

ClientTest

public class ClientTest {
    public static void main(String[] args) {
        Invoker invoker = new Invoker();
        invoker.execute(new RegistCommand());

        Invoker invoker1 = new Invoker();
        invoker1.execute(new HeartbeatCommand());
    }
}

执行结果:

regist ...
heartbeat ...

以上就是命令模式全部内容,感谢阅读。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
命令模式和单例模式是两种常见的设计模式,它们在软件工程中都有各自的作用。 **命令模式Command Pattern)**: 命令模式是一种行为设计模式,它封装了请求并使其能被延迟执行。这个模式涉及三个角色: - **抽象命令Command)**:定义了请求的一般接口,包含了执行请求的方法。 - **具体命令(Concrete Command)**:实现了抽象命令,负责具体的执行操作。 - **客户端(Invoker)**:调用命令,不需要关心命令的内部实现。 结合命令模式,你可以创建一组命令对象,每个命令代表一个特定的操作,而客户端通过单例模式获取唯一的命令管理器,从而能够安全、统一地发送和控制这些命令的执行。 **单例模式(Singleton Pattern)**: 单例模式确保了一个类只有一个实例,并提供一个全局访问点。这在资源有限或者需要全局访问点的场景非常有用,比如数据库连接、日志记录等。 当命令模式和单例模式结合时,可能会这样应用: - 创建一个单例的命令管理器,它负责存储所有的命令对象。 - 当客户端需要执行一个操作时,通过这个单例获取命令实例,而不是每次都去创建一个新的。 - 单例模式保证了在整个应用程序生命周期内,命令管理器始终保持唯一,避免了多个实例可能导致的问题。 相关问题: 1. 在什么情况下会考虑使用命令模式和单例模式的结合? 2. 如何确保命令管理器是单例并且在多线程环境下的安全性? 3. 命令模式和工厂模式有什么区别,它们如何共同应用于系统设计?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值