C#设计模式16——中介者模式的写法
是什么:
中介者模式是一种行为型设计模式,它定义了一个中介者对象来封装一系列对象之间的交互。中介者模式可以使得对象间的交互更加松耦合,避免了对象之间的直接依赖,从而使系统更加灵活、易于扩展和维护。
为什么:
中介者模式可以将系统中的对象之间的交互行为进行抽象,从而可以提高系统的可拓展性、可维护性和可读性。同时,它还可以降低系统的复杂度以及对象间的耦合度。
怎么做:
在中介者模式中,我们定义一个中介者接口,中介者负责协调一系列相关对象的交互,并将这些交互行为抽象为中介者接口中的方法。同时,我们还定义了一些相关对象,这些对象直接不再相互交互,而是通过中介者进行交互。相关对象可以保留对中介者的引用,以便于向中介者发送请求。
下面是一个在C#语言中实现中介者模式的示例:
// 中介者接口
public interface IMediator
{
void SendMessage(string message, Colleague colleague);
}
// 抽象同事类
public abstract class Colleague
{
protected IMediator mediator;
public Colleague(IMediator mediator)
{
this.mediator = mediator;
}
// 定义向中介者发送消息的方法
public void Send(string message)
{
mediator.SendMessage(message, this);
}
// 定义接收消息的方法(由子类实现)
public abstract void Receive(string message);
}
// 具体同事类 A
public class ConcreteColleagueA : Colleague
{
public ConcreteColleagueA(IMediator mediator) : base(mediator)
{
}
public override void Receive(string message)
{
Console.WriteLine("ConcreteColleagueA received message: " + message);
}
}
// 具体同事类 B
public class ConcreteColleagueB : Colleague
{
public ConcreteColleagueB(IMediator mediator) : base(mediator)
{
}
public override void Receive(string message)
{
Console.WriteLine("ConcreteColleagueB received message: " + message);
}
}
// 具体中介者类
public class ConcreteMediator : IMediator
{
private ConcreteColleagueA colleagueA;
private ConcreteColleagueB colleagueB;
public ConcreteMediator(ConcreteColleagueA colleagueA, ConcreteColleagueB colleagueB)
{
this.colleagueA = colleagueA;
this.colleagueB = colleagueB;
}
public void SendMessage(string message, Colleague colleague)
{
if (colleague == colleagueA)
{
colleagueB.Receive(message);
}
else
{
colleagueA.Receive(message);
}
}
}
在这个具体的实现中,我们定义了一个中介者接口 IMediator,以及一个抽象同事类 Colleague。Colleague 类中定义了向中介者发送消息的方法 Send() 和接收消息的方法 Receive(),并持有对中介者的引用。接下来,我们定义了两个具体同事类 ConcreteColleagueA 和 ConcreteColleagueB,它们分别实现了 Colleague 类中的 Receive() 方法。最后,我们定义了一个具体中介者类 ConcreteMediator,它持有对两个具体同事类的引用,并实现了 IMediator 接口中的 SendMessage() 方法。在 SendMessage() 方法中,根据接收消息者的不同,转发消息给对应的同事对象。
何时用:
中介者模式通常适用于以下场景:
1.当一个系统中对象之间的交互关系十分复杂,难以维护时,可以考虑采用中介者模式。
2.当一个系统中对象之间的交互是循环的,即对象之间互相引用时,可以考虑采用中介者模式。
3.当一个对象因为要和很多其他对象交互而导致其工作量过大时,可以考虑采用中介者模式。
4.当系统需要支持松耦合,易于维护和扩展时,可以考虑采用中介者模式。
C#设计模式16——中介者模式的写法的更多相关文章
- C#设计模式(16)——中介者模式
1.中介者模式介绍 中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系,中介者使各个对象之间不需要显式地相互引用,从而降低耦合性.在开发中我们会遇到各个对象相互引用的情况,每个对象都可以和多 ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 折腾Java设计模式之中介者模式
博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...
- js设计模式——8.中介者模式
js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...
- 设计模式之中介者模式(Mediator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 【GOF23设计模式】中介者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...
- [设计模式] 17 中介者模式 Mediator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...
- 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)
中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...
- 设计模式之中介者模式(Mediator )
中介者模式是关于数据交互的设计模式,该模式的核心是一个中介者对象,负责协调一系列对象之间的不同的数据请求,这一系列对象成为同事类.如房产中介(简直不想提它),买房的卖房的,租房的放租的都到房产中介那里 ...
- PHP设计模式系列 - 中介者模式
中介者模式 中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改.一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式. ...
随机推荐
- 浅谈SQL优化小技巧
回顾MySQL的执行过程,帮助介绍如何进行sql优化. (1)客户端发送一条查询语句到服务器: (2)服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据: (3)未命中缓存后,MySQL通过 ...
- Rong晔大佬教程学习(0):前言
2023-12-13 在安装了tinyriscv的工具链之后,本想着说去看那个技术文档,但是那个技术文档只是相当于一个"使用手册",而不是技术教程,所以说还是得去补一补计组的知识. ...
- Oracle数据库卸载器 - 开源研究系列文章
今天无事,把网上搜到的Oracle数据库卸载器的软件更新到C#的Winform界面的操作上. 1. 程序目录: 与笔者的其它软件类似,目录如下: 2. 使用的类: 这里主要使用了一个处理函数: 3. ...
- Apache POI 操作Excel简单入门使用
Apache POI简介 开发中经常会涉及到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel ...
- Python——第二章:字典(dictionary)以及 添、删、改、查
首先, 字典是以键值对的形式进行存储数据的,必须有键[key],有值[value] 字典的表示方式: {key:value, key2:value, key3:value} 举例: dic = {&q ...
- 【eBPF-03】进阶:BCC 框架中 BPF 映射的应用 v1.0
eBPF 中实现内核态代码与用户态代码是可以实时通信的,这主要靠 BPF 映射 来实现. BPF 映射 是内核空间的一段内存,以 键值对 的方式存储.内核态程序可以直接访问 BPF 映射,用户态需要通 ...
- 7.elasticsearch重建索引
什么时候需要重建索引 索引的mappings发生变更 索引的setting发生变更 集群内,集群间,需要做数据迁移 update by query 在现有索引重建 比如需要给一个text新增一个子字段 ...
- CodeForces 808G Anthem of Berland 前缀函数 KMP DP
原题链接 题意 第一行给我们一串长为s,只包含小写字母与问号的字符串A,第二行给我们一个长为t只有小写字母的字符串B, 同时满足 $ s * t \le 1e7 $ 我们可以把问号变成任意的字母,我们 ...
- linux中创建新用户并且放到用户组中
1.打开终端并以 root 用户身份登录到 Linux 系统 2.使用以下命令创建一个新用户 sudo useradd -m username 将 "username" 替换为你要 ...
- 实践GoF的设计模式:代理模式
摘要: 代理模式为一个对象提供一种代理以控制对该对象的访问. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:代理模式>,作者:元闰子 . 简介 GoF 对代理模式(Prox ...