中介者模式:集中协调对象交互,简化耦合实现灵活可控的系统结构

文章目录

一、引言

​ 中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入中介者对象来简化多个对象之间的交互关系,从而使各个对象不需要显式地相互引用,降低对象之间的耦合度。这种模式通过集中化对象之间的通信,使得系统更容易理解和维护,同时也便于控制对象间的复杂交互。

二、应用场景与技术背景

中介者模式适用于以下场景:

  1. 多个类之间存在复杂的网状交互关系,且这些交互关系随着需求变更容易变得混乱和难以管理。
  2. 当系统中某个类过多依赖其他类,或者类间依赖关系发生变化时,可能需要频繁修改原有代码。

例如,在多人在线游戏中,玩家角色之间可以直接互动(攻击、交易、组队等),这种直接交互会导致角色类之间的耦合度极高,而且随着游戏规则的更新,角色间交互逻辑的维护成本也会非常高。通过中介者模式,可以创建一个游戏规则管理器来集中处理角色间的交互,从而降低角色类之间的耦合度,提高系统的可维护性。

三、模式定义与实现

中介者模式的核心组成部分包括:

  1. Mediator(中介者角色):定义一个接口,用于与各个Colleague对象进行通信,集中处理Colleague对象之间的交互。
  2. ConcreteMediator(具体中介者角色):实现Mediator接口,它知道并维护各个Colleague对象,并负责协调它们之间的交互关系。
  3. Colleague(同事角色):每一个Colleague都知道中介者,并通过中介者与其他Colleague对象进行通信,而不是直接与其他Colleague通信。

以多人在线游戏中的玩家角色交互为例,来具体实现中介者模式:

  1. 定义中介者接口(Mediator):创建一个名为GameMediator的接口,声明处理玩家角色交互的方法。

    java 复制代码
    public interface GameMediator {
        void attack(Player attacker, Player target);
        void trade(Player requester, Player accepter, Item item);
        void formTeam(Player leader, Player joiner);
    }
  2. 定义具体中介者类(ConcreteMediator):创建一个名为GameRulesManager的类,实现GameMediator接口,处理玩家角色的各种交互行为。

    java 复制代码
    public class GameRulesManager implements GameMediator {
    
        @Override
    public void attack(Player attacker, Player target) {
            // 根据游戏规则处理攻击行为
            System.out.println(attacker.getName() + " 攻击了 " + target.getName());
        }
    
        @Override
        public void trade(Player requester, Player accepter, Item item) {
            // 根据游戏规则处理交易行为
            System.out.println(requester.getName() + " 与 " + accepter.getName() + " 进行了交易, 物品:" + item.getItemName());
        }
    
    @Override
        public void formTeam(Player leader, Player joiner) {
            // 根据游戏规则处理组队行为
            System.out.println(joiner.getName() + " 加入了由 " + leader.getName() + " 的队伍");
        }
    }
  3. 定义同事角色(Colleague):创建一个名为Player的类,代表游戏中的玩家角色,拥有自身的属性和方法,并通过中介者与其他玩家进行交互。

    java 复制代码
    public class Player {
        private String name;
        private GameMediator mediator;
    
        public Player(String name) {
            this.name = name;
        }
    
        public Player(String name, GameMediator mediator) {
            this.name = name;
            this.mediator = mediator;
        }
    
        public String getName() {
            return name;
        }
    
        public void attack(Player target) {
            mediator.attack(this, target);
        }
    
        public void requestTrade(Player player, Item item) {
            mediator.trade(this, player, item);
        }
    
        public void joinTeam(Player leader) {
            mediator.formTeam(leader, this);
        }
    }
  4. 物品(Item)类:

    java 复制代码
    public class Item {
        private String itemName;
        private int itemValue;
    
        public Item(String itemName, int itemValue) {
        this.itemName = itemName;
            this.itemValue = itemValue;
        }
    
        public String getItemName() {
            return itemName;
        }
    
        public int getItemValue() {
            return itemValue;
        }
    
    @Override
        public String toString() {
            return "Item{" +
                    "itemName='" + itemName + '\'' +
                    ", itemValue=" + itemValue +
                    '}';
        }
    }
  5. 应用端使用:在游戏中,玩家角色通过中介者来发起和响应各种交互请求。

    java 复制代码
    public class MediatorPatternDemo {
        public static void main(String[] args) {
            // 创建玩家和中介者
            Player player1 = new Player("玩家A", new GameRulesManager());
            Player player2 = new Player("玩家B", new GameRulesManager());
    
            // 玩家A攻击玩家B
            player1.attack(player2);
    
            // 玩家A请求与玩家B交易
            Item item = new Item("道具", 100);
            player1.requestTrade(player2, item);
    
            // 玩家B加入玩家A的队伍
            player2.joinTeam(player1);
        }
    }

    测试结果

四、优缺点分析

优点:

  1. 减少对象之间的耦合度:通过中介者集中处理对象间的交互,避免了对象间的直接引用和依赖,使得系统更易于理解和维护。
  2. 简化系统结构:将原本复杂的多对多交互关系转化为一对多的关系,有利于控制和管理复杂行为。

潜在挑战:

  1. 中介者类可能会成为庞大而复杂的单点,增加了系统的复杂性。
  2. 如果中介者的职责划分不当,可能会导致部分职责过于集中,不易维护。

总结:

中介者模式通过引入中介者对象来管理和协调多个对象之间的交互,有效降低了对象间的耦合度,提升了系统的可维护性和扩展性。在实际应用中,合理运用中介者模式有助于理清对象间的交互逻辑,优化系统架构,但在设计时需注意避免中介者类过于庞大和复杂,保证其职责明确且易于维护。

相关推荐
Daniel 大东13 分钟前
BugJson因为json格式问题OOM怎么办
java·安全
哪 吒4 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象6 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王7 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康7 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud