36中介者模式(Mediator Pattern)

2024-01-02 00:58

本文主要是介绍36中介者模式(Mediator Pattern),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

依赖关系的转化:         

 


动机(Motivate):
     在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。
    在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。
意图(Intent):
    用一个中介对象来封装一系列对象交互。中介者使各对象不需要相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。                                                                          ------《设计模式》GOF
结构图(Struct):
          

适用性:
    1.一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
    2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
    3.想定制一个分布在多个类中的行为,而又不想生成太多的子类。
代码实现:

1     //Mediator
2    abstract class AbstractChatroom
3     {
4        public abstract void Register(Participant participant);
5        public abstract void Send(string from, string to, string message);
6     }

 

 1     //ConcreteMediator
 2     class Chatroom :AbstractChatroom
 3     {
 4         private Hashtable participants = new Hashtable();
 5         public override void Register(Participant participant)
 6         {
 7             if (participants[participant.Name] == null)
 8             {
 9                 participants[participant.Name]=participant;
10             }
11             participant.Chatroom = this;
12         }
13         public override void Send(string from, string to, string message)
14         {
15             Participant pto = (Participant)participants[to];
16             if (pto != null)
17             {
18                 pto.Receive(from, message);
19             }
20         }
21     }

 

 1     //AbstractColleague
 2     class Participant
 3     {
 4         private Chatroom chatroom;
 5         private string name;
 6         
 7         //Constructor
 8         public Participant(string name)
 9         {
10             this.name = name;
11         }
12         //Properties
13         public string Name
14         {
15             get { return name; }
16         }
17         public Chatroom Chatroom
18         {
19             set { chatroom = value; }
20             get { return chatroom; }
21           
22         }
23         public void Send(string to, string message)
24         {
25             chatroom.Send(name, to, message);
26         }
27         public virtual void Receive(string from, string message)
28         {
29             Console.WriteLine("{0} to {1}:'{2}'", from, name, message);
30         }
31     }

 

 1     //ConcreteColleaguel
 2     class Beatle :Participant
 3     {
 4      //Constructor
 5         public Beatle(string name)
 6             : base(name)
 7         { }
 8         public override void Receive(string from, string message)
 9         {
10             Console.Write("To a Beatle: ");
11             base.Receive(from, message);
12         }
13     }

 

 1     //ConcreteColleague2
 2     class NonBeatle :Participant
 3     {
 4         //Constructor
 5         public NonBeatle(string name)
 6             : base(name)
 7         { }
 8         public override void Receive(string from, string message)
 9         {
10             Console.Write("To a non-Beatle:");
11             base.Receive(from, message);
12         }
13     }

客户端调用如下:

 1 static void Main(string[] args)
 2         {
 3             //create chatroom
 4             Chatroom chatroom = new Chatroom();
 5             //Create participants and register them
 6             Participant George = new Beatle("George");
 7             Participant Paul = new Beatle("Paul");
 8             Participant Ringo = new Beatle("Ringo");
 9             Participant John = new Beatle("John");
10             Participant Yoko = new Beatle("Yoko");
11             chatroom.Register(George);
12             chatroom.Register(Paul);
13             chatroom.Register(Ringo);
14             chatroom.Register(John);
15             chatroom.Register(Yoko);
16 
17             //chatting participants
18             Yoko.Send("John", "Hi John");
19             Paul.Send("Ringo", "All you need is love");
20             Ringo.Send("George", "My sweet Lord");
21             Paul.Send("John", "Can't buy me love");
22             John.Send("Yoko", "My sweet love");
23         }

运行结果如下:
            
Mediator实现要点:
    1.将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关系”为多“个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。
    2.随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。 这时候可以对Mediator对象进行分解处理。
    3.Facade模式是解耦系统外到系统内(单向)的对象关系关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。

这篇关于36中介者模式(Mediator Pattern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/560956

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素