设计模式(十七)中介者

一、定义

义一个对象来封装一系列的对象交互。中介者模式使各对象不需要显示地相互引用,从而使其耦合松散,而且可以让你相对独立地改变它们之间的交互。中介者模式又称为调停模式,它是一种对象说行为型模式。

二、描述

在中介者模式中,引入了用于协调其他对象/类之间的相互调用的中介者类,为了让系统具有更好的灵活性和可扩展性,通常还提供了抽象中介者,包含以下四个角色: 1、Mediator(抽象中介者):它定义了一个接口,该接口用于与各同事对象之间进行通信。
2、ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,维持了各个同事对象的引用。
3、Colleague(抽象同事类):它定义了各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
4、ConcreteColleague(具体同事类):它是抽象同事类的子类,每一个同事对象需要和其他对象通信时,先与中介者对象通信,通过中介者来间接完成与其他同事类的通信,在具体同事类中实现了在抽象同事类中声明的抽象方法。

三、例子

X公司欲开发一套CRM系统,其中包含一个客户信息管理模块,界面包含了按钮、文本框、列表框、下拉框等多个组件,增加或删除一个客户,各组件均会发生联动效果,较为复杂。
Mediator:抽象中介者

C# 复制代码
public abstract class Mediator
{
    public abstract void ComponenetChanged(Component c);
}

ConcreteMediator:具体中介者

C# 复制代码
public class ConcreteMediator : Mediator
{
    // 维持对各个同事对象的引用
    public Button addButton;
    public List list;
    public TextBox userNameTextBox;
    public ComboBox cb;

    // 封装同事对象之间的交互
    public override void ComponenetChanged(Component c)
    {
        // 单击按钮
        if (c == addButton)
        {
            Console.WriteLine("-- 单击增加按钮 --");
            list.Update();
            cb.Update();
            userNameTextBox.Update();
        }
        // 从列表框选择客户
        else if (c == list)
        {
            Console.WriteLine("-- 从列表框选择客户 --");
            cb.Select();
            userNameTextBox.SetText();
        }
        // 从组合框选择客户
        else if (c == cb)
        {
            Console.WriteLine("-- 从组合框选择客户 --");
            cb.Select();
            userNameTextBox.SetText();
        }
    }
}

Component:抽象组件,充当抽象同事类(Colleague)

C# 复制代码
public abstract class Component
{
    protected Mediator mediator;

    public void SetMediator(Mediator mediator)
    {
        this.mediator = mediator;
    }

    // 转发调用
    public void Changed()
    {
        mediator.ComponenetChanged(this);
    }

    public abstract void Update();
}

Button、List、ComboBox、TextBox:按钮、列表框、组合框、文本框,具体组件,充当具体同事类(ConcreteColleague)

C# 复制代码
public class Button : Component
{
    public override void Update()
    {
        // 按钮不产生响应
    }
}

public class List : Component
{
    public override void Update()
    {
        Console.WriteLine("列表框增加一项:张无忌");
    }

    public void Select()
    {
        Console.WriteLine("列表框选中项:小龙女");
    }
}

public class ComboBox : Component
{
    public override void Update()
    {
        Console.WriteLine("组合框增加一项:张无忌");
    }

    public void Select()
    {
        Console.WriteLine("组合框选中项:小龙女");
    }
}

public class TextBox : Component
{
    public override void Update()
    {
        Console.WriteLine("客户信息增加成功后文本框清空");
    }

    public void SetText()
    {
        Console.WriteLine("文本框显示:小龙女");
    }
}

Program:客户端测试类

C# 复制代码
// Step1.定义中介者对象
ConcreteMediator mediator = new ConcreteMediator();

// Step2.定义同事对象
Button addButton = new Button();
List list = new List();
ComboBox cb = new ComboBox();
TextBox userNameTextBox = new TextBox();

addButton.SetMediator(mediator);
list.SetMediator(mediator);
cb.SetMediator(mediator);
userNameTextBox.SetMediator(mediator);

mediator.addButton = addButton;
mediator.list = list;
mediator.cb = cb;
mediator.userNameTextBox = userNameTextBox;

// Step3.点击增加按钮
addButton.Changed();

Console.WriteLine("---------------------------------------------");

// Step4.从列表框选择客户
list.Changed();
Console.ReadLine();

四、总结

1、优点

(1)中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星形结构。
(2)可将各同事对象解耦,中介者模式有利于各同事之间的松耦合,可以独立地改变和复用每一个同事和中介者,增加新的中介者类和新的同事类都比较方便,更好地符合开闭原则。
(3)可以减少子类的生成,中介者模式将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可被重用,无须直接对同事类进行扩展。

2、缺点

(1)具体中介者子类中包含了大量的同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

相关推荐
触底反弹2 小时前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
杨充1 天前
10.可测试性实战设计
设计模式·开源·代码规范
杨充1 天前
9.重构十二式的实战
设计模式·开源·代码规范
杨充1 天前
6.设计原则的全景图
设计模式·开源·全栈
杨充1 天前
2.面向对象的特性
设计模式
杨充1 天前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充1 天前
8.反模式与坏味道
设计模式·开源·代码规范
杨充1 天前
3.接口vs抽象类比较
设计模式
咖啡八杯1 天前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法