【设计模式】JAVA Design Patterns——Commander(指挥官模式)

🔍目的


用于处理执行分布式事务时可能遇到的所有问题。

🔍解释


处理分布式事务很棘手,但如果我们不仔细处理,可能会带来不想要的后果。假设我们有一个电子商务网站,它有一个支付微服务和一个运输微服务。如果当前运输可用,但支付服务不可用,或者反之,当我们已经收到用户的订单后,我们应该如何处理?我们需要有一个机制来处理这些情况。我们必须将订单指向其中一个服务(在这个例子中是运输),然后将订单添加到另一个服务的数据库中(在这个例子中是支付),因为两个数据库不能原子地更新。如果我们当前无法做到这一点,应该有一个队列,可以将这个请求排队,并且必须有一个机制,允许队列中出现失败。所有这些都需要通过不断的重试,在保证幂等性(即使请求多次,变化只应用一次)的情况下,由一个指挥类来完成,以达到最终一致性的状态。

程序示例

定义命令接口

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

创建具体的命令类

java 复制代码
class LightOnCommand implements Command {
    private Light light;

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

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

创建接收者类

java 复制代码
class Light {
    public void turnOn() {
        System.out.println("Light is on");
    }
}

创建调用者类

java 复制代码
class RemoteControl {
    private Command command;

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

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

执行内容类

java 复制代码
public class CommanderPatternExample {
    public static void main(String[] args) {
        Light light = new Light();
        Command command = new LightOnCommand(light);

        RemoteControl remoteControl = new RemoteControl();
        remoteControl.setCommand(command);

        remoteControl.pressButton();
    }
}

🔍类图


🔍适用场景


当我们需要提交两个数据库去完成事务,提交不是原子性且可能因此造成问题时,适合用这个设计模式。


相关推荐
女王大人万岁几秒前
Golang实战gRPC与Protobuf:从入门到进阶
服务器·开发语言·后端·qt·golang
时寒的笔记2 分钟前
js基础05_js类、原型对象、原型链&案例(解决无限debugger)
开发语言·javascript·原型模式
小胖java3 分钟前
音乐推荐系统
java·spring boot
人间打气筒(Ada)4 分钟前
「码动四季·开源同行」go语言:如何使用 ELK 进行日志采集以及统一处理?
开发语言·分布式·elk·go·日志收集·分布式日志系统
波波0077 分钟前
每日一题:C#中using的三种用法
开发语言·c#
游乐码8 分钟前
c#万物之父
开发语言·c#
2401_827499999 分钟前
python核心语法05-模块
java·前端·python
EnoYao10 分钟前
把你们开发扒个底朝天 Skill
前端·后端·程序员
xiaoshuaishuai812 分钟前
C# Chrome安全机制解析
开发语言·visualstudio·c#
鱼鳞_12 分钟前
Java学习笔记_Day23(双列集合)
java·笔记·学习