找回密码
 立即注册
首页 业界区 业界 设计模式(十七)中介者

设计模式(十七)中介者

裸历 2025-6-9 08:31:00
一、定义

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

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

X公司欲开发一套CRM系统,其中包含一个客户信息管理模块,界面包含了按钮、文本框、列表框、下拉框等多个组件,增加或删除一个客户,各组件均会发生联动效果,较为复杂。
2.png
Mediator:抽象中介者
  1. public abstract class Mediator
  2. {
  3.     public abstract void ComponenetChanged(Component c);
  4. }
复制代码
ConcreteMediator:具体中介者
  1. public class ConcreteMediator : Mediator
  2. {
  3.     // 维持对各个同事对象的引用
  4.     public Button addButton;
  5.     public List list;
  6.     public TextBox userNameTextBox;
  7.     public ComboBox cb;
  8.     // 封装同事对象之间的交互
  9.     public override void ComponenetChanged(Component c)
  10.     {
  11.         // 单击按钮
  12.         if (c == addButton)
  13.         {
  14.             Console.WriteLine("-- 单击增加按钮 --");
  15.             list.Update();
  16.             cb.Update();
  17.             userNameTextBox.Update();
  18.         }
  19.         // 从列表框选择客户
  20.         else if (c == list)
  21.         {
  22.             Console.WriteLine("-- 从列表框选择客户 --");
  23.             cb.Select();
  24.             userNameTextBox.SetText();
  25.         }
  26.         // 从组合框选择客户
  27.         else if (c == cb)
  28.         {
  29.             Console.WriteLine("-- 从组合框选择客户 --");
  30.             cb.Select();
  31.             userNameTextBox.SetText();
  32.         }
  33.     }
  34. }
复制代码
Component:抽象组件,充当抽象同事类(Colleague)
  1. public abstract class Component
  2. {
  3.     protected Mediator mediator;
  4.     public void SetMediator(Mediator mediator)
  5.     {
  6.         this.mediator = mediator;
  7.     }
  8.     // 转发调用
  9.     public void Changed()
  10.     {
  11.         mediator.ComponenetChanged(this);
  12.     }
  13.     public abstract void Update();
  14. }
复制代码
Button、List、ComboBox、TextBox:按钮、列表框、组合框、文本框,具体组件,充当具体同事类(ConcreteColleague)
  1. public class Button : Component
  2. {
  3.     public override void Update()
  4.     {
  5.         // 按钮不产生响应
  6.     }
  7. }
  8. public class List : Component
  9. {
  10.     public override void Update()
  11.     {
  12.         Console.WriteLine("列表框增加一项:张无忌");
  13.     }
  14.     public void Select()
  15.     {
  16.         Console.WriteLine("列表框选中项:小龙女");
  17.     }
  18. }
  19. public class ComboBox : Component
  20. {
  21.     public override void Update()
  22.     {
  23.         Console.WriteLine("组合框增加一项:张无忌");
  24.     }
  25.     public void Select()
  26.     {
  27.         Console.WriteLine("组合框选中项:小龙女");
  28.     }
  29. }
  30. public class TextBox : Component
  31. {
  32.     public override void Update()
  33.     {
  34.         Console.WriteLine("客户信息增加成功后文本框清空");
  35.     }
  36.     public void SetText()
  37.     {
  38.         Console.WriteLine("文本框显示:小龙女");
  39.     }
  40. }
复制代码
Program:客户端测试类
  1. // Step1.定义中介者对象
  2. ConcreteMediator mediator = new ConcreteMediator();
  3. // Step2.定义同事对象
  4. Button addButton = new Button();
  5. List list = new List();
  6. ComboBox cb = new ComboBox();
  7. TextBox userNameTextBox = new TextBox();
  8. addButton.SetMediator(mediator);
  9. list.SetMediator(mediator);
  10. cb.SetMediator(mediator);
  11. userNameTextBox.SetMediator(mediator);
  12. mediator.addButton = addButton;
  13. mediator.list = list;
  14. mediator.cb = cb;
  15. mediator.userNameTextBox = userNameTextBox;
  16. // Step3.点击增加按钮
  17. addButton.Changed();
  18. Console.WriteLine("---------------------------------------------");
  19. // Step4.从列表框选择客户
  20. list.Changed();
  21. Console.ReadLine();
复制代码
3.png

四、总结

1、优点

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

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册