行为型模式 - 中介者模式Mediator
创始人
2025-05-28 02:51:54
0

学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

模式的定义与特点

     中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

只有一个仲裁者.

模式的优点

  • 降低了类的复杂度,将一对多转化成了一对一。
  • 各个类之间的解耦。
  • 符合迪米特法则。
  • 符合单一职责原则
  • 符合开闭原则:可以在不更改现有代码的情况下添加新的中介程序

模式的缺点

  • 如果用不好,那中介者类会变庞大,变得复杂难以维护。

 

using DesignPattern.MediatorPattern;
using System;namespace DesignPattern
{internal class Program{static void Main(string[] args){MediatorHelper();}#region Pattern - Mediatorstatic void MediatorHelper(){ConcreteMediator m = new ConcreteMediator();//让 具体同事类 认识 中介者对象 ConcreteColleague c1 = new ConcreteColleague("c1", m);ConcreteColleague c2 = new ConcreteColleague("c2", m);ConcreteColleague c3 = new ConcreteColleague("c3", m);ConcreteColleague c4 = new ConcreteColleague("c4", m);//让 中介者 认识各个 具体同事类对象m.AddColleague(c1);m.AddColleague(c1);m.AddColleague(c2);m.AddColleague(c3);m.AddColleague(c4);c1.Send("c1: 大家加班到这么晚,都吃过了吗?");Console.WriteLine();c2.Send("c2: 没有呢,c1你打算请客不?");Console.WriteLine();c3.Send("c3: 什么? c1打算请客么?");Console.WriteLine();c4.Send("c4: 大家AA吧,挣钱都不容易的.");Console.WriteLine();c1.Send("c1: 还是c4好,去吃饭吧。");Console.ReadLine();}#endregion}
}//======================================================================================namespace DesignPattern.MediatorPattern
{/// /// 抽象中介者/// public abstract class Mediator{/// /// 发送消息/// /// 消息内容/// 给谁发public abstract void Send(string message, Colleague colleague);}/// /// 抽象同事类/// public abstract class Colleague{//中介者protected Mediator m_mediator;protected string m_name;public Colleague(Mediator mediator, string name){this.m_mediator = mediator;m_name = name;}public string Name => m_name;/// /// 发送消息/// /// 消息内容public abstract void Send(string message);/// /// 接受消息/// /// 消息内容public abstract void Notify(string message);}//======================================================================================/// /// 具体的中介者, eg: ChangedMediator/// public class ConcreteMediator : Mediator{private List colleagues;public ConcreteMediator(){colleagues = new List();}~ConcreteMediator(){while (colleagues.Count > 0){colleagues.RemoveAt(0);}colleagues.Clear();colleagues = null;}public void AddColleague(Colleague colleague){if (colleagues.Contains(colleague)){Console.WriteLine($"中介者已经知道当前同事{colleague.Name}了,不要重复介绍.");return;}colleagues.Add(colleague);}public override void Send(string message, Colleague colleague){for (int i = 0; i < colleagues.Count; i++){if (colleagues[i] == colleague){//自己不能给自己发送消息continue;}colleagues[i].Notify(message);}}}//======================================================================================/// /// 具体同事类/// public class ConcreteColleague : Colleague{public ConcreteColleague(string name, Mediator mediator) : base(mediator, name){}public override void Send(string message){m_mediator.Send(message, this);}public override void Notify(string message){Console.WriteLine($"同事 {m_name} 得到信息:{message}");}}
}

总结:

      个人感觉像是自如平台、调度中心这样的,还有一个MVC框架,我觉得这个C层就是一个中介者,但MVC还算不上是中介者模式,如果事件也需要让注册者知道注册的是哪一个事件,那事件也是一个很好的中介者模式。不过都是自己的拙见,如果文章公开后,内容有误,还希望指出。


希望大家:点赞,留言,关注咯~    
😘😘😘😘

唠家常

今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们😄

今日推荐

  • 博客杂货铺
  • GoF23 种设计模式的分类和功能

相关内容

热门资讯

笨鸟学数据结构(绪论) 数据结构的定义按某种逻辑关系组织起来的一批数据,按一定的映象方式把它存放在计算机的存储...
不使用cocoapods-ar... 不使用cocoapods-art插件情况下与jfrog协作原理下载索引创建git仓库或者更新git仓...
微机原理 || push p... 考试真的考了push和pop ,那个加减到底是什么? PUSH 源   ...
使用Spring Boot和C... 原理 Spring Boot是一个基于Spring框架的快速开发应用程序的框架,其提供...
python数据类型常见操作 目录 一、python常见的赋值方式 1.交互性赋值方式 2.连续性赋值方式 3.单独赋值方式 二...
系统架构:经典三层架构 引言 经典三层架构是分层架构中最原始最典型的分层模式,其他分层架构都是其变种或扩展&#...
c++ 流 stream Text Stream: 有解析(parse)和格式化&#...
【springboot】web... 5、视图解析与模板引擎 视图解析:SpringBoot默认不支持 JSP,...
【Java注释】如何自定义注解... 一,如何自定义注解 1.1 在编译时进行格式检查(JDK内置的三个基本注解) ...
Redis案例实战_微信抢红包 目录需求分析架构设计编码实现拓展 需求分析 首先想到发红包的流程 1.发红包 2.抢红包 3.记录红...
关于朋友的思考 关于朋友的思考 朋友就是你高兴时想见的人,烦恼时想找的人,得到对方帮助...
Cobalt Strike--... 获取凭证和哈希      要dump哈希,通过 [beacon] → Access →...
第二章 运算方法和运算器 引入:1. 运算器的运算功能 计算机能够进行的运算包括:算术运算和逻辑运...
DevData Talks 直... 📊本期分享 本期 DevData Talks 邀请到了微众银行研发效能负责人余伟老师...
postgresql基本操作与... postgresql基本操作与基本对象 postgresql是一个C/S架构的大型软件࿰...
【洛谷 P1028】[NOIP... [NOIP2001 普及组] 数的计算 题目描述 给出自然数 nnn,要求按如下方式构...
实验一 Java Web 入门 一、实验目标: 1、了解并学会配置MyEclipse集成开发环境,学会在...
人人都能学会,深扒网络模型OK... 简单理解 http 的三次握手,首先客户端先进行一个connect连接,...
还在用传统工具进行做计划?试试... 说起计划,很多人以为自己制定计划的能力很强,他们会在记事本上或者日历上定...
Vue插槽理解 Vue插槽理解插槽 插槽 slot又名插槽,vue内容分发机制,组件内...