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设计模式系列 - 中介者模式
中介者模式 中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改.一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式. ...
随机推荐
- Java核心知识体系8:Java如何保证线程安全性
Java核心知识体系1:泛型机制详解 Java核心知识体系2:注解机制详解 Java核心知识体系3:异常机制详解 Java核心知识体系4:AOP原理和切面应用 Java核心知识体系5:反射机制详解 J ...
- Java8新特性之FlatMap&Reduce
1.FlagMap // flatMap:接收一个T返回一个R,将一个元素转为一个新的流 ;R apply(T t); <R> Stream<R> flatMap(Functi ...
- 华企盾DSC备用服务器无法启动,日志显示“主服务器停机超过十天”
出现该问题有三种情况: 1.主服务器未启动或授权到期: 2.主服务器申请的在线授权且ERP上存在到期的相同序列号: 3.备用服务器的数据库与主服务器连的不是同一个(检查IP和端口以及数据库名).
- [CD随身听] 1984年~2005年索尼全系列Discman+CD_WALKMAN珍贵资料
文章转载自:家电论坛https://jdbbs.com(由网友xieminjie整理提供) https://jdbbs.com/forum.php?mod=viewthread&tid=295 ...
- Redis配置模式及各自优缺点
大家好,我是闲者,今天简单聊下redis部署模式.Redis支持多种不同的数据结构和模式,以满足不同的使用场景.以下是一些常见的Redis配置和模式示例以及详解.原文地址:Redis配置模式及各自优缺 ...
- 放弃JavaFx开发学习
放弃JavaFx开发学习 一开始学学习JavaFx是想用java写个小游戏,后来学者JavaFx越来越深,发现坑也越来越多,不禁感叹:JavaFx果然是要抛弃的UI玩儿,UI开发还是用react na ...
- GitHub OAuth2的授权指南
一.OAuth2简介 OAuth 2.0(开放授权 2.0)是一种用于授权的开放标准,旨在允许用户在不提供他们的用户名和密码的情况下,授权第三方应用访问其在另一网站上的信息.它是在网络服务之间安全地共 ...
- 【manim动画教程】--目录(完结)
manim是一个生成数学教学视频的动画引擎. 它用编程的方式创建精美的数学动画,让数学更加易懂. 本教程简单介绍了 manim 的基本使用方式,基于 v0.17.2 版本 manim 安装 manim ...
- 当创建statefulset资源后,k8s组件如何协作
本文分享自华为云社区<当创建StatefulSet后,k8s会发生什么?>,作者:可以交个朋友 . 一.StatefulSet介绍 StatefulSet 是用来管理有状态应用的工作负载对 ...
- 2种GaussDB(DWS)查看作业运行信息方式
摘要:提供以作业基本单位的作业统计视图pgxc_session_wlmstat,便于用户观察运行作业和排队作业信息. 本文分享自华为云社区<GaussDB(DWS)如何查看作业运行信息>, ...