1.什么是中介者模式?

中介者模式是一种行为型设计模式,通关引入一个“中介者对象”,封装对象之间的交互,从而让各个对象之间不再彼此引用,降低耦合。

简单理解:之前聊天是面对面,现在是通过中介。

2.为什么需要中介者模式?

UI、角色、系统模块多的时候,常见写法是:

UI -> Player
UI -> Enemy
Enemy -> Player
Player -> UI

问题:类之间强依赖,改了一个类,可能要改一堆。逻辑分散,难维护。新增交互成本极高。

3.中介者模式的核心思想

引入一个中介者,所有对象不再直接引用,只有中介者通信,中介者同一调度,转发逻辑

Player  ─┐
Enemy   ├──> Mediator <── UI
Weapon  ─┘

4.中介者模式结构

角色说明

角色说明
Mediator中介者接口
ConcreteMediator具体中介者
Colleague同事类(被协调的对象)
ConcreteColleague具体同事类

5.实战示例

场景需求:玩家点击攻击按钮,敌人扣血,UI更新,玩家与敌人不直接引用

//中介者接口
public interface IMediator
{
    void Notify(object sender, string eventType);
}

//具体中介者
public class BattleMediator : IMediator
{
    public Player Player { get; set; }
    public Enemy Enemy { get; set; }
    public BattleUI UI { get; set; }

    public void Notify(object sender, string eventType)
    {
        switch (eventType)
        {
            case "Attack":
                Enemy.TakeDamage(Player.AttackPower);
                UI.UpdateEnemyHp(Enemy.HP);
                break;

            case "EnemyDead":
                UI.ShowWin();
                break;
        }
    }
}

//同事类
public class Player
{
    private IMediator mediator;
    public int AttackPower = 10;

    public Player(IMediator mediator)
    {
        this.mediator = mediator;
    }

    public void Attack()
    {
        mediator.Notify(this, "Attack");
    }
}

//敌人类
public class Enemy
{
    private IMediator mediator;
    public int HP = 50;

    public Enemy(IMediator mediator)
    {
        this.mediator = mediator;
    }

    public void TakeDamage(int damage)
    {
        HP -= damage;
        if (HP <= 0)
        {
            mediator.Notify(this, "EnemyDead");
        }
    }
}

//同事UI类
public class BattleUI
{
    private IMediator mediator;

    public BattleUI(IMediator mediator)
    {
        this.mediator = mediator;
    }

    public void OnAttackButtonClick()
    {
        mediator.Notify(this, "Attack");
    }

    public void UpdateEnemyHp(int hp)
    {
        Debug.Log("Enemy HP: " + hp);
    }

    public void ShowWin()
    {
        Debug.Log("You Win!");
    }
}

//使用:
public class GameEntry : MonoBehaviour
{
    void Start()
    {
        BattleMediator mediator = new BattleMediator();

        Player player = new Player(mediator);
        Enemy enemy = new Enemy(mediator);
        BattleUI ui = new BattleUI(mediator);

        mediator.Player = player;
        mediator.Enemy = enemy;
        mediator.UI = ui;

        // 模拟按钮点击
        ui.OnAttackButtonClick();
    }
}








6.优点与缺点

优点:解耦对象关系,集中管理交互逻辑,对象更纯粹,职责更单一。

缺点:容易变成上帝类,逻辑过多,需要拆分多个中介者,不适合极其简单的交互。

更多推荐