乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

【愚公系列】二十三种设计模式(十七)-中介者模式(Mediator Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情
[索引页]
[源码下载]


乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)


作者: webabcd


介绍
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。


示例
有一个Message实体类,某个对象对它的操作有Send()和Insert()方法,现在用一个中介对象来封装这一系列的对象交互。



MessageModel
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Mediator
{
    
/// <summary>
    
/// Message实体类
    
/// </summary>

    public class MessageModel
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="msg">Message内容</param>
        
/// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)
        
{
            
this._message = msg;
            
this._publishTime = pt;
        }


        
private string _message;
        
/// <summary>
        
/// Message内容
        
/// </summary>

        public string Message
        
{
            
get { return _message; }
            
set { _message = value; }
        }


        
private DateTime _publishTime;
        
/// <summary>
        
/// Message发布时间
        
/// </summary>

        public DateTime PublishTime
        
{
            
get { return _publishTime; }
            
set { _publishTime = value; }
        }

    }

}


AbstractMessageMediator
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Mediator
{
    
/// <summary>
    
/// 抽象中介者(Mediator)
    
/// </summary>

    public abstract class AbstractMessageMediator
    
{
        
/// <summary>
        
/// 注册一个操作Message的对象
        
/// </summary>
        
/// <param name="AbstractMessage">AbstractMessage</param>

        public abstract void Register(AbstractMessage AbstractMessage);

        
/// <summary>
        
/// 发送Message
        
/// </summary>
        
/// <param name="from">来自UserId</param>
        
/// <param name="to">发送到UserId</param>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public abstract string Send(string from, string to, MessageModel mm);
    }

}


MessageMediator
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Mediator
{
    
/// <summary>
    
/// 中介者(ConcreteMediator)
    
/// </summary>

    public class MessageMediator : AbstractMessageMediator
    
{
        
private Dictionary<string, AbstractMessage> _dictionary = new Dictionary<string, AbstractMessage>();

        
/// <summary>
        
/// 注册一个操作Message的对象
        
/// </summary>
        
/// <param name="abstractMessage">AbstractMessage</param>

        public override void Register(AbstractMessage abstractMessage)
        
{
            
if (!_dictionary.ContainsKey(abstractMessage.UserId))
            
{
                _dictionary.Add(abstractMessage.UserId, abstractMessage);
            }


            abstractMessage.AbstractMessageMediator 
= this;
        }


        
/// <summary>
        
/// 发送Message
        
/// </summary>
        
/// <param name="from">来自UserId</param>
        
/// <param name="to">发送到UserId</param>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public override string Send(string from, string to, MessageModel mm)
        
{
            AbstractMessage abstractMessage 
= _dictionary[to];
            
if (abstractMessage != null)
            
{
                
return abstractMessage.Insert(from, mm);
            }

            
else
            
{
                
return null;
            }

        }

    }

}


AbstractMessage
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Mediator
{
    
/// <summary>
    
/// 操作Message抽象类(Colleague)
    
/// </summary>

    public abstract class AbstractMessage
    
{
        
private AbstractMessageMediator _abstractMessageMediator;
        
private string _userId;

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="userId">UserId</param>

        public AbstractMessage(string userId)
        
{
            
this._userId = userId;
        }


        
/// <summary>
        
/// UserId
        
/// </summary>

        public string UserId
        
{
            
get { return _userId; }
        }


        
/// <summary>
        
/// 中介者
        
/// </summary>

        public AbstractMessageMediator AbstractMessageMediator
        
{
            
get { return _abstractMessageMediator; }
            
set { _abstractMessageMediator = value; }
        }


        
/// <summary>
        
/// 发送Message(由客户端调用)
        
/// </summary>
        
/// <param name="to">发送到UserId</param>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public string Send(string to, MessageModel mm)
        
{
            
return _abstractMessageMediator.Send(_userId, to, mm);
        }


        
/// <summary>
        
/// 接受Message(由中介者调用)
        
/// </summary>
        
/// <param name="from">来自UserId</param>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public abstract string Insert(string from, MessageModel mm);
    }

}


SqlMessage
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Mediator
{
    
/// <summary>
    
/// Sql方式操作Message(ConcreteColleague)
    
/// </summary>

    public class SqlMessage : AbstractMessage
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="userId">UserId</param>

        public SqlMessage(string userId)
            : 
base(userId)
        
{

        }


        
/// <summary>
        
/// 接受Message(由中介者调用)
        
/// </summary>
        
/// <param name="from">来自UserId</param>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public override string Insert(string from, MessageModel mm)
        
{
            
return "Sql方式插入Message(" + from + "发送给" + base.UserId + ")"
                
+ " - 内容:" + mm.Message
                
+ " - 时间:" + mm.PublishTime.ToString();
        }

    }

}


XmlMessage
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Mediator
{
    
/// <summary>
    
/// Xml方式操作Message(ConcreteColleague)
    
/// </summary>

    public class XmlMessage : AbstractMessage
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="userId">UserId</param>

        public XmlMessage(string userId)
            : 
base(userId)
        
{

        }


        
/// <summary>
        
/// 接受Message(由中介者调用)
        
/// </summary>
        
/// <param name="from">来自UserId</param>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public override string Insert(string from, MessageModel mm)
        
{
            
return "Xml方式插入Message(" + from + "发送给" + base.UserId + ")"
                
+ " - 内容:" + mm.Message
                
+ " - 时间:" + mm.PublishTime.ToString();
        }

    }

}



Test
using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

using  Pattern.Mediator;

public  partial  class  Mediator : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        AbstractMessageMediator messageMediator 
= new MessageMediator();

        AbstractMessage user1 
= new SqlMessage("user1");
        AbstractMessage user2 
= new SqlMessage("user2");
        AbstractMessage user3 
= new XmlMessage("user3");
        AbstractMessage user4 
= new XmlMessage("user4");

        messageMediator.Register(user1);
        messageMediator.Register(user2);
        messageMediator.Register(user3);
        messageMediator.Register(user4);

        Response.Write(user1.Send(
"user2", new MessageModel("你好!", DateTime.Now)));
        Response.Write(
"<br />");
        Response.Write(user2.Send(
"user1", new MessageModel("我不好!", DateTime.Now)));
        Response.Write(
"<br />");
        Response.Write(user1.Send(
"user2", new MessageModel("不好就不好吧。", DateTime.Now)));
        Response.Write(
"<br />");
        Response.Write(user3.Send(
"user4", new MessageModel("吃了吗?", DateTime.Now)));
        Response.Write(
"<br />");
        Response.Write(user4.Send(
"user3", new MessageModel("没吃,你请我?", DateTime.Now)));
        Response.Write(
"<br />");
        Response.Write(user3.Send(
"user4", new MessageModel("不请。", DateTime.Now)));
        Response.Write(
"<br />");
    }

}


运行结果
Sql方式插入Message(user1发送给user2) - 内容:你好! - 时间:2007-5-19 23:43:19
Sql方式插入Message(user2发送给user1) - 内容:我不好! - 时间:2007-5-19 23:43:19
Sql方式插入Message(user1发送给user2) - 内容:不好就不好吧。 - 时间:2007-5-19 23:43:19
Xml方式插入Message(user3发送给user4) - 内容:吃了吗? - 时间:2007-5-19 23:43:19
Xml方式插入Message(user4发送给user3) - 内容:没吃,你请我? - 时间:2007-5-19 23:43:19
Xml方式插入Message(user3发送给user4) - 内容:不请。 - 时间:2007-5-19 23:43:19


参考
http://www.dofactory.com/Patterns/PatternMediator.aspx


OK
[源码下载]
ollama服务暴露公网?三步搞定Nginx反向代理配置(避坑指南) 本文详细介绍了如何通过Nginx反向代理安全地将Ollama服务暴露到公网,避免直接修改OLLAMA_HOST带来的安全隐患。文章提供了从SSL证书部署到高级安全加固的全流程实战指南,包括IP白名单、基础认证、速率限制等企业级安全措施,帮助用户实现安全可靠的外部访问。 阅读详情

相关推荐

PowerBI参数化实战:3分钟搞定动态数据源切换(附常见错误排查)

本文详细介绍了PowerBI参数化实战技巧,教你3分钟实现动态数据源切换。通过创建参数、改造查询和测试切换三步,轻松应对多环境部署与团队协作中的路径问题,并附上常见错误排查指南,有效提升报表的可维护性和工作效率。

p1q2r的博客 585

【C#设计模式】17.中介者模式(Mediator Pattern)【行为型】

1.1 动机(Motivate) 在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断地变化。 在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。 1.2 意图(Intent) 定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。   .....

星Yeah 的博客 2333

Modelsim安装教程以及管理员身份运行patch_dll.bat时找不到文件mgls.dll的解决

Modesim安装教程 Modesim版本有很多,但是安装方式大都相同,我们以modesim.10.5为例,电脑使用的是win10 64位,讲一下安装过程中的步骤以及出现问题的解决方法 一 安装 1.首先解压安装包,在解压的安装包内选择应用程序,右键选择管理员运行。 2.稍等一会,有的电脑会弹出是否允许modesim进行更改,选择 是 即可,然后出现下面的界面,点击下一步。 3.弹出此界面选择安装路径,选择安装路径,我是在D盘新建的文件夹,直接把文件夹中的路径复制在框内。文件夹名称切记不要带中文 4.

weixin_48564372的博客 1万+

C#设计模式之中介者模式(Mediator Pattern)

一、引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室、QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解。 二、 中介者模式的介绍 2.1 中介者模式的定义 从生活中的例子可以看出,不论是QQ游戏还是QQ群,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如

MR_yuan24的专栏 652

【知识图谱】一文看懂知识图谱的搭建实践与科普教程(5万字完结篇)

所有可能的实体对:(“Mate40”,“华为”), (“Mate40”,“手机”), (“华为”,“手机”)。送入关系模型分类,预期输出 (“Mate40”,“华为”): 品牌, (“Mate40”,“手机”): 属于类别, (“华为”,“手机”): 无关系。,定义了图谱中概念和关系的类型层次结构,相当于知识图谱的“纲领”和“schema”。训练完成后,当模型看到新的句子,比如“苹果的MacBook笔记本性能强大”,识别出实体“苹果”(品牌)和“MacBook”(产品)后,就能正确输出关系“品牌”。

weixin_41645791的博客 2611

R语言中5种正态性检验的方法

统计学中的t检验和方差分析等方法的应用条件是样本都来自正态总体或近似正态总体,只有符合这个条件,才能用这些方法来检验各样本所属的总体参数的差异显著性。文本向大家介绍在R语言中检验正态性的几种方法: 1、Kolmogorov-Smirnov检验 K-S检验检验单一样本是否来自某一特定分布。比如检验一组数据是否为正态分布。它的检验方法是以样本数据的累积频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。K-S检验的原假设和备择假设为: H0:样本所来自的总体分布服从

Mrrunsen的博客 2万+

C#设计模式之中介者模式

中介者模式 文章目录中介者模式模式分类模式产生的原因模式类图代码实现中介者模式总结中介者模式的优点:中介者模式的缺点: 本篇博客将介绍中介者模式,中介者模式提供一种对象之间简化复杂交互的解决方案,通过引入中介者,将原本对象之间两两交互的关系转变为每个对象和中介者之间的关系,中介者可以对对象之间的通讯进行控制和调节,降低原来系统的耦合度,使得系统更加灵活和易于拓展。 模式分类 行为型设计模式。 模式产生的原因 在QQ的聊天中,存在两种聊天方式,一种是两个用户之间直接进行聊天,另一种是将所有相关用户放在一个QQ

BraveRunTo的博客 774

MIKE 21 教程 1.5 基于卫星影像绘制河道边界

上一节讲解了如何输入高程数据与绘制网格本节讲解如何根据卫星影像绘制河道边界。在实际项目中,经常遇到河道图纸缺少的情况,此时可以根据卫星影像进行勾勒绘制。常用的地理信息软件均可完成此功能,这里使用大家较为熟悉的ArcGis进行教学(本文默认大家有基础ArcGis操作知识,如有不懂可留言)。

Hello Word 3282

Mediator Pattern(中介者模式、调停者模式)

对中介者模式的学习、理解和应用案例

我与岁月的森林的博客 500

uniapp [安卓苹果App端] - 详细实现下载文件保存到用户手机本地,指定文件存储位置路径及文件夹名称下载并保存,Uniapp app端将文件下载保存并储存到指定目录(手机系统存储空间权限检测)

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,app端下载文件,移动端文件下载,并保存到手机本地存储空间,uniapp下载文件保存到手机本地,iOS下载文件怎么保存,系统读写存储空间权限,下载文件到本地详细流程及源代码,保存自定义目录,uniapp,实现下载文件并保存到本地,文件后缀,如何指定手机的存放目录路径url,点击下载文档到手机中并提示存储位置,如何在uniapp中实现文件下载功能,uniApp文件下载,怎么指定文件保存目录,下载报错,没反应

🏆 前端领域优质创作者 1万+

灰度图像采集显示

灰度图像采集显示 在FPGA内部,采集到的视频数据线通过一个FIFO,将原本与25MHZ时钟同步的数据流转换到FPGA内部50MHZ的时钟。接着将这个数据再送入写DDR3缓存的异步FIFO中,这个FIFO中的数据一旦达到一定数量,就会被写入DDR3中。于此同时,使用另一异步FIFO缓存从DDR3读出的图像数据;LCD驱动模块不断地发出读图像数据请求给到这个FIFO,从中读取图像数据并送给VGA显示器进行实时图像的显示。 ...

小柚子的博客 484

C# 中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,它允许一组对象相互通信,而不需要知道彼此的内部结构。通过引入一个中介者对象,将原本对象之间的直接交互转化为与中介者对象的交互,从而降低了对象之间的耦合度,使得系统更加灵活和易于维护。这种模式特别适用于对象之间存在大量复杂交互关系的场景。

語衣的个人博客 1146

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58= GetFlowDropDown SQL注入

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58=、eHR/OA一体化智慧云平台、智慧一卡通云平台、行业软件开发与定制、智慧企业管理信息化咨询与项目服务为核心业务的顾问式管理咨询和软件个性定制开发的高科技股份集团公司。同鑫T9eHR信息华管理系统存在SQL注入漏洞,攻击者可通过该漏洞上传shell。关闭互联网暴露面或接口设置访问权限。利用sqlmap进行shell。

iSee857的博客 698

C# 设计模式:第二十章 - 行为型模式 之 中介者模式(Mediator Pattern)

中介者模式是一种行为型设计模式,它允许你通过一个中介者对象来协调多个对象之间的交互,从而减少对象之间的直接依赖。中介者模式的核心思想是将多个对象之间的复杂交互封装到一个中介者类中,使得对象之间不再直接通信,而是通过中介者进行间接通信。通过这种方式,你可以简化对象之间的关系,降低系统的耦合度,并提高代码的可维护性。在这章中,我们学习了中介者模式的基本概念、应用场景、实现方法以及注意事项。中介者模式允许你通过一个中介者对象来协调多个对象之间的交互,从而减少对象之间的直接依赖。聊天应用:如协调用户之间的消息传递。

caifox的博客 1225

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

中介者模式(Mediator Pattern)

设计模式 - 吕震宇 .NET设计模式系列文章 薛敬明的专栏 乐在其中设计模式(C#) 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松

jiangxinyu的专栏 2892

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C#设计模式:中介者模式(Mediator Pattern)

一,什么是中介者模式(Mediator Pattern)? 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。比如:如果我们实现两个人的交互,难道我们要定义两个对象如ChineseA,ChineseB和ChineseC,然后他们都一起说话聊天,我们要他们之间的交互改成他们和中介的交互实现聊天。在这里我们需要用到中介者设计模式,将交互的由将交互的形式有...

dcujcivw769565的博客 196

C#设计模式(18)——中介者模式(Mediator Pattern)

C#设计模式(18)——中介者模式(Mediator Pattern) 一、引言   在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室、QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解。 二、 中介者模式的介绍 2.1 中介者模式的定义   从生活中的例子可以看出,不论是QQ游戏还是...

fgmah2000的博客 284

中介者模式(Mediator Pattern)介绍(抖动判断)

例如,多个设备(同事)产生状态数据,StatusDebouncer 作为中介者,处理状态并协调通知观察者或触发报警。StatusDebouncerMediator 作为中介者,接收设备状态,执行去抖动逻辑,并通知相关组件(如日志、报警器)。中介者协调:device1 发送状态,中介者处理去抖动逻辑,在满足条件(3秒)时通知 device1 和 device2。Colleague(同事):需要交互的对象,与中介者通信,而不是直接与其他同事交互。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 561

设计模式---Mediator Pattern

中介者模式Mediator PatternMediator 角色分析类图代码示例 Mediator Pattern 中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散。 Mediator 角色分析 中介者模式包含四个角色: Mediator: 抽象中介者 用于定义一个接口,该接口用于与各同事对象之间的通信; ConcreteMediator: 具体中介者 是抽象中介者的子类,通过协调各个同事对象来实现协作行为,了解并维护它的各个同事对象的引用;

菜鸟专栏 288

【C#设计模式(18)——中介者模式(Mediator Pattern)】

中介者模式:是两者之间通过第三者来帮助传话。

weixin_43626218的博客 539

C#设计模式读书笔记之中介者模式(Mediator pattern)

中介者模式(Mediator pattern)【使用频率:★★☆☆☆】 1.概述:用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式是“迪米特法则”的一个典型应用 2. 模式中的角色 2.1 Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。 2.2 Concr...

qq826364410的专栏 271
上一篇: 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
下一篇: 新瓶旧酒ASP.NET AJAX(1) - 简单地过一下每个控件(ScriptManager、ScriptManagerProxy、UpdatePanel、UpdateProgress和Timer)
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值