是什么:

中介者模式是一种行为型设计模式,它定义了一个中介者对象来封装一系列对象之间的交互。中介者模式可以使得对象间的交互更加松耦合,避免了对象之间的直接依赖,从而使系统更加灵活、易于扩展和维护。

为什么

中介者模式可以将系统中的对象之间的交互行为进行抽象,从而可以提高系统的可拓展性、可维护性和可读性。同时,它还可以降低系统的复杂度以及对象间的耦合度。

怎么做:

在中介者模式中,我们定义一个中介者接口,中介者负责协调一系列相关对象的交互,并将这些交互行为抽象为中介者接口中的方法。同时,我们还定义了一些相关对象,这些对象直接不再相互交互,而是通过中介者进行交互。相关对象可以保留对中介者的引用,以便于向中介者发送请求。

下面是一个在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——中介者模式的写法的更多相关文章

  1. C#设计模式(16)——中介者模式

    1.中介者模式介绍 中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系,中介者使各个对象之间不需要显式地相互引用,从而降低耦合性.在开发中我们会遇到各个对象相互引用的情况,每个对象都可以和多 ...

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

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  3. 折腾Java设计模式之中介者模式

    博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...

  4. js设计模式——8.中介者模式

    js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...

  5. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 【GOF23设计模式】中介者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...

  7. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

  8. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  9. 设计模式之中介者模式(Mediator )

    中介者模式是关于数据交互的设计模式,该模式的核心是一个中介者对象,负责协调一系列对象之间的不同的数据请求,这一系列对象成为同事类.如房产中介(简直不想提它),买房的卖房的,租房的放租的都到房产中介那里 ...

  10. PHP设计模式系列 - 中介者模式

    中介者模式 中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改.一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式. ...

随机推荐

  1. [USACO2007NOVG] Cow Relays G

    题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...

  2. [ABC279G] At Most 2 Colors

    Problem Statement There is a grid with $1 \times N$ squares, numbered $1,2,\dots,N$ from left to rig ...

  3. 组合式api-计算属性computed的使用

    计算属性在vue3中和vue2的思想概念都是一样,唯一区别就是在使用组合式api时候的语法稍有不同. 使用步骤: 导入computed函数 import {computed} from 'vue' 使 ...

  4. 整一个工具类【根据URL地址获取file文件对象】

    整一个工具类[根据URL地址获取file文件对象] 直接将网络url文件转换为file对象 import java.io.*; import java.net.URL; public class Im ...

  5. Python——第一章:if语法规则

    if语句的语法规则: ======第一种======        if 条件:            代码        如果条件成立就执行代码        如果不成立, 就不执行 案例1: mo ...

  6. C#数据结构与算法系列(十三):递归——迷宫问题

    1.示例 2.代码实现 public class Maze { public static void Test() { int[][] map = new int[8][]; for (int i = ...

  7. Boost程序库完全开发指南:1-开发环境和构建工具

      Boost官方于2019年12月发布的1.72版编写,共包含160余个库/组件,涵盖字符串与文本处理.容器.迭代器.算法.图像处理.模板元编程.并发编程等多个领域,使用Boost,将大大增强C++ ...

  8. 第十三部分_awk

    一.awk介绍 1. awk概述 awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具.数据可以来自标准输入.一个或多个文件,或其它命令的输出 ...

  9. GaussDB(for Redis)多租户:读写权限控制和数据库隔离的完美融合

    本文分享自华为云社区<GaussDB(for Redis)企业级特性揭秘之多租户管理>,作者: GaussDB 数据库 . 华为云GaussDB(for Redis)持续完善企业级增强特性 ...

  10. 伯克利:serverless是下一代计算范式

    摘要:Serverless技术正是云厂商的基于规模经济的一个选择. 引子 刚过去的HC2020,华为面向多样化算力的时代,发布了DC分布式计算的三个开发套件,其中一个是元戎组件.元戎是基于函数计算的分 ...