设计模式(十七)中介者

一、定义

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

二、描述

在中介者模式中,引入了用于协调其他对象/类之间的相互调用的中介者类,为了让系统具有更好的灵活性和可扩展性,通常还提供了抽象中介者,包含以下四个角色: 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)具体中介者子类中包含了大量的同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

相关推荐
sg_knight7 小时前
设计模式实战:命令模式(Command)
python·设计模式·命令模式
渔舟小调13 小时前
P11 | 收藏与行程:用户行为类接口的设计模式
数据库·设计模式·oracle
小程故事多_8016 小时前
从基础Agent到复杂工作流,LangGraph如何用状态机重构智能体开发
人工智能·设计模式·重构·aigc·ai编程
hypoy16 小时前
Claude Code 的 1M Context 怎么用:一篇官方文章的读后整理
设计模式·claude
IT 行者18 小时前
软件设计模式会不会是制约大模型编程的障碍?
设计模式·ai编程
t***54419 小时前
还有哪些设计模式适合现代C++
开发语言·c++·设计模式
t***54419 小时前
如何在现代C++项目中有效应用这些设计模式
开发语言·c++·设计模式
贵慜_Derek19 小时前
我们能从 DeerFlow 学到哪些优秀的技术架构设计
人工智能·设计模式·架构
csdn_aspnet20 小时前
了解 ASP.NET Core 中的防伪技术
后端·asp.net·csrf·.net core
csdn_aspnet20 小时前
如何保护您的 .NET Web API 免受常见安全威胁
安全·xss·csrf·.net core·cors