命令模式(请求与具体实现解耦)

目录

前言

UML

plantuml

类图

实战代码

模板

Command

Invoker

Receiver

Client


前言

命令模式解耦了命令请求者(Invoker)和命令执行者(receiver),使得 Invoker 不再直接引用 receiver,而是依赖于抽象的命令接口。具体的命令类则直接引用 receiver,通过调用 receiver 的方法来执行命令。

解耦之后,具体命令的增删改不再影响 Invoker,同时,抽象出来的命令请求还能队列化,从而实现撤销和重试功能,或做排列组合合成复杂的命令。

在 Invoker 中,也体现了桥接模式的思想,将命令的抽象和具体的实现分离,使 Invoker 中命令的添加和扩展更加简单。不过具体的命令类并不直接实现处理逻辑,而是交给了 receiver 来实现,这也是命令模式和桥接模式最主要的区别。

UML

plantuml

复制代码
@startuml
'https://plantuml.com/class-diagram

interface Command {
    + execute() : void
}

class CommandA {
    - receiver : Receiver
    + CommandA(Receiver)
    + execute() : void
}

class CommandB {
    - receiver : Receiver
    + CommandB(Receiver)
    + execute() : void
}

class Receiver {
    + executeA() : void
    + executeB() : void
}

class Invoker {
    - commands : List<Command>
    + addCommand(Command) : void
    + execute(Command) : void
    + executes() : void
}

class Client {}

Command <|.. CommandA
Command <|.. CommandB

CommandA "1" --> "1" Receiver
CommandB "1" --> "1" Receiver

Invoker "1" --> "n" Command

Client ..> Invoker
Client ..> Command

@enduml

类图

实战代码

模板

Command

java 复制代码
public interface Command {
    void execute();
}

public class ConcreteCommand1 implements Command {
    private Receiver receiver;

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

    public void execute() {
        receiver.execute1();
    }
}


public class ConcreteCommand2 implements Command {
    private Receiver receiver;

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

    public void execute() {
        receiver.execute2();
    }
}

Invoker

java 复制代码
public class Invoker {
    private List<Command> commands = new ArrayList<Command>();
    public void addCommand(Command command){
        commands.add(command);
    }

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

    public void executes(){
        for(Command command : commands){
            command.execute();
        }
        commands.clear();
    }
}

Receiver

java 复制代码
public class Receiver {
    public void execute1() {
        System.out.println("execute1.");
    }

    public void execute2() {
        System.out.println("execute2.");
    }
}

Client

java 复制代码
public class Test {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        
        Invoker invoker = new Invoker();

        invoker.execute(new Command1(receiver));

        invoker.addAction(new Command1(receiver));
        invoker.addAction(new Command2(receiver));
        invoker.executes();
    }
}
相关推荐
Halo_tjn1 天前
反射与设计模式1
java·开发语言·算法
神仙别闹1 天前
基于Python + SQL server 实现(GUI)原神圣遗物管理与角色数值模拟系统
java·数据库·python
是有头发的程序猿1 天前
电商自动化实战:淘宝/天猫item_get商品详情API全量采集教程(Python源码)
java·python·自动化
古韵1 天前
告别手写分页逻辑:usePagination 从 50 行到 3 行
java·前端
北城以北88881 天前
Quartz定时任务
java·spring boot·intellij-idea
许彰午1 天前
JWT的四种设计策略——轻量负载缓存外置上下文线程统一验证
java·安全·缓存·tomcat
小bo波1 天前
Java Swing 可视化素数筛:动态演示 1~120 质数筛选【附完整源码】
java·算法·可视化·swing·素数
天若有情6731 天前
【C++趣味实战】仿写Burp代理逻辑!自定义可控迭代器:拦截Intercept/放行Forward/重放Repeater全实现
java·开发语言·c++
迷藏4941 天前
Python+DuckDB:轻量级BI流水线实战
java·开发语言·python·原型模式
磊 子1 天前
C++function与bind绑定器讲解
java·jvm·c++