设计模式之命令模式

定义:

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

目的:

将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

何时使用:

在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

如何解决:

通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。

关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

主要涉及到以下几个核心角色:

复制代码
命令(Command):
    定义了执行操作的接口,通常包含一个 execute 方法,用于调用具体的操作。

具体命令(ConcreteCommand):
    实现了命令接口,负责执行具体的操作。它通常包含了对接收者的引用,通过调用接收者的方法来完成请求的处理。

接收者(Receiver):
    知道如何执行与请求相关的操作,实际执行命令的对象。

调用者/请求者(Invoker):
    发送命令的对象,它包含了一个命令对象并能触发命令的执行。调用者并不直接处理请求,而是通过将请求传递给命令对象来实现。

客户端(Client):
    创建具体命令对象并设置其接收者,将命令对象交给调用者执行。

// 定义士兵类
class Soldier {
    public void attack() {
        System.out.println("士兵发起进攻!");
    }
}

// 定义长官类
class Commander {
    private Soldier soldier;

    public Commander(Soldier soldier) {
        this.soldier = soldier;
    }

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

    // 定义具体命令,即长官下达的命令
    class AttackCommand implements Command {
        @Override
        public void execute() {
            soldier.attack();
        }
    }

    // 设置命令
    public void setCommand(Command command) {
        this.command = command;
    }

    // 发布命令
    public void issueCommand() {
        command.execute();
    }

    private Command command;
}

// 客户端
public class CommandPatternExample {
    public static void main(String[] args) {
        // 创建士兵
        Soldier soldier = new Soldier();
        // 创建长官,并指定士兵
        Commander commander = new Commander(soldier);
        // 创建具体命令对象,并设置给长官
        Commander.Command command = commander.new AttackCommand();
        commander.setCommand(command);
        // 长官发布命令
        commander.issueCommand();
    }
}

代码运行截图

相关推荐
AI人工智能+电脑小能手9 小时前
大白话说Java设计模式-23-桥接模式(源码剖析篇)
java·设计模式·jdbc·桥接模式·源码分析·awt·java logging
嘟嘟071712 小时前
TypeScript 工具类型通关:Pick、Omit、Partial、Record 区别与 Omit 等价实现一次讲清
设计模式·面试·typescript
SL_staff13 小时前
中小离散制造如何用工艺路线模板解决‘人走流程丢’——JVS-APS 实践解析
java·设计模式·全栈
Asize13 小时前
3 种设计模式 + DI:Nest.js 后端第一课
后端·设计模式·nestjs
St_rive1 天前
Page Object设计模式
java·开发语言·设计模式
烬羽2 天前
NestJS 依赖注入:Controller 里那个没有 new 的 service,到底从哪来的?
设计模式·typescript·nestjs
用户938515635072 天前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
烬羽2 天前
从 nest new 到 Hello World:一个最小 NestJS 项目,讲透工厂 + 装饰器 + 模块化
设计模式·node.js·nestjs
艺艺生辉3 天前
从if-else到策略模式
后端·设计模式
小林ixn3 天前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式