首页 > 其他分享 >中介者模式

中介者模式

时间:2024-01-31 16:24:00浏览次数:23  
标签:服务 模式 order private 中介 OrderProcessingService public

中介者模式

用途:
如果多个服务经常一起使用,可以创建一个中介者服务来封装这些服务的协作。请举个例子,说明一下如何引入中介者,中介者如何帮助程序找到该使用的服务

中介者模式的例子

引入中介者模式的目的是为了降低系统中多个组件或类之间的直接交互,从而减少它们之间的耦合度。中介者充当协调者的角色,使得各个组件不需要直接相互引用,而是通过中介者来进行通信。

下面是一个简单的例子,说明如何在一个电商应用中引入中介者服务来封装订单处理的协作逻辑:

假设我们有以下几个服务:

  • InventoryService:库存服务,负责管理商品库存。
  • PaymentService:支付服务,负责处理支付事务。
  • ShippingService:物流服务,负责处理商品配送。

在没有中介者的情况下

一个订单处理的服务可能直接依赖上述所有服务

@Service
public class OrderService {
    @Autowired
    private InventoryService inventoryService;
    @Autowired
    private PaymentService paymentService;
    @Autowired
    private ShippingService shippingService;

    public void processOrder(Order order) {
        // 检查库存
        boolean inStock = inventoryService.checkInventory(order);
        if (!inStock) {
            throw new OutOfStockException();
        }
        // 处理支付
        paymentService.processPayment(order.getPaymentDetails());
        // 安排发货
        shippingService.scheduleDelivery(order);
    }
}

引入中介者后

我们可以创建一个名为 OrderProcessingService 的中介者服务来封装订单处理的逻辑:

@Service
public class OrderProcessingService {
    private final InventoryService inventoryService;
    private final PaymentService paymentService;
    private final ShippingService shippingService;

    @Autowired
    public OrderProcessingService(InventoryService inventoryService,
                                  PaymentService paymentService,
                                  ShippingService shippingService) {
        this.inventoryService = inventoryService;
        this.paymentService = paymentService;
        this.shippingService = shippingService;
    }

    public void processOrder(Order order) {
        // 检查库存
        boolean inStock = inventoryService.checkInventory(order);
        if (!inStock) {
            throw new OutOfStockException();
        }
        // 处理支付
        paymentService.processPayment(order.getPaymentDetails());
        // 安排发货
        shippingService.scheduleDelivery(order);
    }
}

现在,其他服务或控制器可以只依赖这个 OrderProcessingService,而不是直接依赖三个不同的服务:

@RestController
public class OrderController {
    private final OrderProcessingService orderProcessingService;

    @Autowired
    public OrderController(OrderProcessingService orderProcessingService) {
        this.orderProcessingService = orderProcessingService;
    }

    @PostMapping("/order")
    public ResponseEntity<String> createOrder(@RequestBody Order order) {
        orderProcessingService.processOrder(order);
        return ResponseEntity.ok("Order processed successfully");
    }
}

结论

通过这种方式,OrderController 只需要与 OrderProcessingService 交互,而不必关心订单处理涉及到的底层服务细节。这样,如果将来订单处理的逻辑发生变化,只需要修改 OrderProcessingService,而不会影响到 OrderController。

中介者服务 OrderProcessingService 使得程序更容易找到并使用正确的服务,因为它为订单处理提供了一个清晰的、单一的入口点。这样的封装还降低了组件之间的耦合,提高了代码的可维护性和可扩展性。

标签:服务,模式,order,private,中介,OrderProcessingService,public
From: https://www.cnblogs.com/PythonOrg/p/17999494

相关文章

  • 汽车软件开发模式的5个特点
    汽车软件开发属于较为复杂的系统工程,经常让来自不同知识背景的工程师在观点交锋时出现分歧。在解决复杂性和对齐讨论基准时,可以通过勾勒出讨论对象最关键的几个特征来树立典型概念。本文旨在通过5个典型特点的抽取,来勾勒出汽车软件开发模式的特殊性和变迁性。01.车载与非车载软件......
  • 状态模式
    定义:允许一个对象在其内部状态改变时,改变它的行为类型:行为型适用场景:一个对象存在多个状态(不同状态下行为不同),且状态可以相互转换优点:将不同的状态隔离把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖增加新的状态非常简单缺点:状态多的业务场景导致类数目增加,......
  • 访问者模式
    定义:封装作用于某数据结构(如List/Set/Map等)中的各元素操作补充定义:可以在不改变各元素类的前提下,定义作用于这些元素的操作类型:行为型适用场景:一个数据结构(如List/Set/Map等)包含很多类型对象数据结构与数据操作分离优点:增加新的操作很容易,即增加一个新的访问者缺点:增......
  • 使用IDEA打jar包三种方式 步骤(包含跳过测试模式)
    使用IDEA打jar包三种方式步骤(包含跳过测试模式)正文:方式一:网络最常见的打包方式。比较适用于普通项目打JAR包。方式二:比较适用于MAVEN项目打JAR包。方式三:maven界面。方式一:网络最常见的打包方式。比较适用于普通项目打JAR包。选中菜单栏中File–>ProjectStructure(文件–>项......
  • 设计模式一句话总结
    1.设计原则(SOLID原则)原则名字原则描述单一职责原则(S)功能只有一个开闭原则(O)开放扩展,关闭修改里氏替换原则(L)子类需要实现父类功能以保持兼容性接口隔离原则(I)不用的函数或者功能不要出现依赖倒置原则(D)细节依赖于抽象,约定优先迪米特法则只和朋友说话......
  • 双亲委派模式的优点
    一道面试题能不能自己写个类叫java.lang.System?答案:通常不可以,但可以采取另类方法达到这个需求。解释:为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统......
  • 设计模式相关介绍
    设计模式使用原则主要包括以下几点:单一职责原则:一个类只负责一项职责,即一个类应该只有一个职责,该职责由类的一个职责来定义。这样可以提高类的可维护性和可复用性。开闭原则:软件实体应当对扩展开放,对修改封闭。也就是说,软件的功能扩展应当通过增加新代码来实现,而不是通过修改已......
  • 关于SortableJS在handle模式下移动端无法拖拽的解决办法
    原因个人项目使用到了这个库,PC操作好好的,移动端一看不行,然后去官方github-issues查看搜mobile的issue,发现大家也会这样。找了一圈看了下,应该是handle(句柄)模式下,库没有做事件监听导致的。解决办法要么换个库,要么在移动端的时候,取消句柄模式即可。constwrapper:HTMLElement=......
  • csharp 发布订阅 设计模式
    event_learn\Program.csusingSystem;//定义一个发布者类,它有一个MyEvent事件publicclassPublisher{//声明一个事件,使用EventHandler委托类型publiceventEventHandlerMyEvent;//定义一个触发事件的方法protectedvirtualvoidOnMyEvent()......
  • 在K8S中,flannel有几种模式?
    在Kubernetes(简称K8S)中,Flannel作为常用的网络插件之一,为集群提供覆盖网络(OverlayNetwork)支持,帮助Pod间实现跨主机通信。Flannel支持多种后端网络模式来实现这一功能,主要包括:VXLAN模式:VXLAN是一种Layer2虚拟化技术,它通过在IP包内封装二层以太网帧来创建一个跨越三层网络的虚......