• 设计模式-中介者模式


    一、前言

    本文将详细介绍设计模式中的中介者模式,其中包括,中介者模式的优点、缺点、各组成部分。

    二、中介者模式

    在这里插入图片描述

    1、定义

    中介者模式(Mediator Pattern)是一种设计模式,它定义了一个中介者类,该类将多个对象之间的通信抽象化,使得这些对象可以通过中介者进行通信,从而降低它们之间的直接耦合度。中介者模式适用于多个对象之间存在复杂的交互关系,直接耦合会导致代码变得复杂、难以维护和扩展。

    2、未使用/使用中介者模式对比

    2.1、未使用中介者模式:

    在没有使用中介者模式的情况下,多个对象之间可能存在直接的相互依赖,导致代码的耦合度较高。当一个对象需要与其他多个对象进行交互时,它可能需要了解这些对象的详细信息,并直接调用它们的方法,这会增加代码的复杂性和难以维护性。

    2.2、使用中介者模式:

    通过引入中介者模式,可以将多个对象之间的交互抽象化,降低它们之间的直接耦合度。中介者类负责协调和管理各个对象之间的通信,各个对象只需要关注自身的职责,而不必关心其他对象的实现细节。这有助于简化代码,提高可维护性和可扩展性。

    在未使用中介者模式的情况下,系统的各个子系统之间直接相互依赖,子系统之间的方法可以直接相互调用。这样的系统耦合性较大,不利于系统的维护和理解。

    而使用中介者模式后,子系统之间的依赖关系被打破,各个子系统都只与中介者发生依赖,而不直接与其他子系统发生依赖。这样可以将系统中各个子系统的关系解耦,降低系统的复杂性,简化系统设计和理解。同时,中介者模式的引入也可以方便系统扩展和维护,因为对于子系统的修改和增加,只需要修改或增加中介者相应的处理方法即可,不需要对其他子系统进行修改。

    3、角色分析

    3.1、中介者(Mediator):

    中介者类负责协调和管理各个对象之间的通信。它通常包含一个或多个 Colleague 对象的引用,并提供了相应的方法来处理或转发请求。中介者类通常没有具体的业务逻辑,而是根据需要调用相应的 Colleague 对象的方法。

    3.2、同事(Colleague):

    同事类是与中介者类进行交互的各个对象。每个同事类通常包含一些特定的业务逻辑,并且可以通过中介者来与其他同事类进行通信。

    3.3、客户(Client):

    客户类是使用中介者模式的对象。它通常只需要与中介者类进行交互,而不需要直接与各个同事类进行交互。

    4、中介者模式案例分析

    以电商平台的订单管理系统为例,订单管理系统涉及多个角色,如订单、购物车、用户等。这些角色之间存在复杂的交互关系,例如用户添加商品到购物车后可以提交订单,购物车可以修改订单状态等。

    4.1、中介者

    订单管理系统可以作为一个中介者,负责协调和管理各个角色之间的通信。例如,当用户提交订单时,订单管理系统可以调用购物车和库存管理系统的相关方法来处理请求。

    4.2、同事

    购物车、库存管理系统、支付系统等可以作为同事类,它们具有各自的业务逻辑,并可以通过订单管理系统进行通信。例如,购物车可以修改订单状态,库存管理系统可以检查商品库存等。

    4.3、客户

    用户可以作为客户类,他们只需要与订单管理系统进行交互,而不需要直接与其他同事类进行交互。用户可以通过订单管理系统来查看订单状态、取消订单等。

    通过引入中介者模式,可以将各个角色之间的交互抽象化,降低它们之间的直接耦合度。这有助于简化代码,提高可维护性和可扩展性。

    5、代码示例

    // 中介者接口  
    interface OrderMediator {  
        void addItemToCart(String itemId, int quantity);  
        void submitOrder(String userId);  
    }  
      
    // 购物车同事类  
    class ShoppingCart implements Colleague {  
        private Map<String, Integer> items = new HashMap<>();  
        private OrderMediator mediator;  
      
        public ShoppingCart(OrderMediator mediator) {  
            this.mediator = mediator;  
        }  
      
        @Override  
        public void handle(String message) {  
            if (message.startsWith("add")) {  
                String[] parts = message.split("\\s+");  
                addItemToCart(parts[1], 1);  
            } else if (message.equals("submit")) {  
                submitOrder(getUserId());  
            }  
        }  
      
        private void addItemToCart(String itemId, int quantity) {  
            items.put(itemId, items.getOrDefault(itemId, 0) + quantity);  
            mediator.addItemToCart(itemId, quantity);  
        }  
      
        private void submitOrder(String userId) {  
            // TODO: 提交订单的逻辑实现  
            System.out.println("Order submitted by user: " + userId);  
        }  
      
        private String getUserId() {  
            // TODO: 获取用户ID的逻辑实现  
            return "User123";  
        }  
    }  
      
    // 库存管理系统同事类  
    class InventorySystem implements Colleague {  
        private Map<String, Integer> inventory = new HashMap<>();  
        private OrderMediator mediator;  
      
        public InventorySystem(OrderMediator mediator) {  
            this.mediator = mediator;  
        }  
      
        @Override  
        public void handle(String message) {  
            if (message.startsWith("check")) {  
                String[] parts = message.split("\\s+");  
                checkInventory(parts[1]);  
            }  
        }  
      
        private void checkInventory(String itemId) {  
            int quantity = inventory.getOrDefault(itemId, 0);  
            System.out.println("Inventory quantity for item " + itemId + ": " + quantity);  
        }  
    }  
      
    // 订单管理系统中介者类  
    class OrderMediatorImpl implements OrderMediator {  
        private Map<String, Colleague> colleagues = new HashMap<>();  
      
        @Override  
        public void addItemToCart(String itemId, int quantity) {  
            Colleague colleague = colleagues.get(itemId);  
            if (colleague != null) {  
                colleague.handle("add " + quantity);  
            } else {  
                System.out.println("Item not found in the cart");  
            }  
        }  
      
        @Override  
        public void submitOrder(String userId) {  
            Colleague colleague = new ShoppingCart(this);  
            colleagues.put(userId, colleague);  
            colleague.handle("submit");  
        }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    public class Main {  
        public static void main(String[] args) {  
            OrderMediator orderMediator = new OrderMediatorImpl();  
            Colleague shoppingCart = new ShoppingCart(orderMediator);  
            Colleague inventorySystem = new InventorySystem(orderMediator);  
            orderMediator.addItemToCart("item1", 2); // 将item1加入购物车,数量为2  
            orderMediator.submitOrder("User123"); // 提交订单,用户ID为User123  
            inventorySystem.handle("check item1"); // 检查item1的库存数量  
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、总结

    中介者模式是一种重要的设计模式,它通过引入中介者类来降低多个对象之间的直接耦合度,从而提高代码的可维护性和可扩展性。在具体应用中,我们需要根据实际需求选择合适的中介者实现方式,并在合适的场景中应用该模式。

  • 相关阅读:
    摩根大通研究论文:大型语言模型+自动规划器用来作有保障的旅行规划
    ssm在线教学质量评价系统毕业设计源码141550
    v-if和v-for的优先级是什么?
    Linux
    express中间件(简介,流程,分类介绍)
    hook函数之useEffect的使用——自定义hook函数网络请求——
    【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解
    安科瑞无线测温产品在某风电场项目的超温事故预警及分析-安科瑞 蒋静
    R 语言 Hitters 数据分析
    我的创作纪念日
  • 原文地址:https://blog.csdn.net/wmj20001225/article/details/132642548