c#设计模式-行为型模式 之 中介者模式

🚀简介

又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
从下右图中可以看到,任何一个类的变 动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理那些不属于自己的行为。

 

中介者模式包含以下主要角色:
  1. 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  2. 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  3. 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  4. 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

🚀案例

现在租房基本都是通过房屋中介,房主将房屋托管给房屋中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。下面我们用代码来举例一下
🐤抽象中介者( Mediator )角色
public abstract class Mediator
{//声明一个联络方法public abstract void Contact(string message, Person person);
}

🐤具体中介者(ConcreteMediator)角色

MediatorStructure类是一个中介者,它有两个属性,一个是房主(HouseOwner),一个是租客(Tenant)。当房主和租客需要通信时,他们不直接通信,而是通过MediatorStructure这个中介者来传递信息。

Contact方法是中介者的核心方法,它接收两个参数,一个是消息内容,一个是发送消息的人。如果发送消息的人是房主,那么这个消息就会被传递给租客;如果发送消息的人是租客,那么这个消息就会被传递给房主。这样就实现了房主和租客之间的间接通信。

public class MediatorStructure : Mediator
{public HouseOwner houseOwner { get; set; }public Tenant tenant { get; set; }public override void Contact(string message, Person person){if (person == houseOwner){tenant.GetMessage(message);}else{houseOwner.GetMessage(message);}}
}

🐤抽象同事类(Colleague)角色

public abstract class Person
{protected string name;protected Mediator mediator;public Person(string name, Mediator mediator){this.name = name;this.mediator = mediator;}
}

🐤具体同事类(Concrete Colleague)角色

HouseOwner(房屋拥有者)和Tenant(承租人)。这两个类都继承自Person类,并且都有一个Mediator类型的成员变量,用于与中介者进行通信。

HouseOwner类有两个方法,一个是Contact,用于与中介者联系,另一个是GetMessage,用于获取信息。在Contact方法中,会调用mediator的Contact方法,将自己和消息传递给中介者。在GetMessage方法中,会打印出自己获取到的信息。

//具体同事类 房屋拥有者
public class HouseOwner : Person
{public HouseOwner(string name, Mediator mediator) : base(name, mediator) { }//与中介者联系public void Contact(string message){mediator.Contact(message, this);}//获取信息public void GetMessage(string message){Console.WriteLine("房主" + name + "获取到的信息:" + message);}
}//具体同事类 承租人
public class Tenant : Person
{public Tenant(string name, Mediator mediator) : base(name, mediator) { }//与中介者联系public void Contact(string message){mediator.Contact(message, this);}//获取信息public void GetMessage(string message){Console.WriteLine("租房者" + name + "获取到的信息:" + message);}
}

👻测试类

在测试类中,有三个角色:房主(HouseOwner)、租户(Tenant)和中介(Mediator)。房主和租户都只需要知道中介即可,他们之间的所有交互都通过中介来进行。

在Main函数中,首先创建了一个中介机构(mediator),然后创建了一个名为张三的房主(houseOwner)和一个名为李四的租户(tenant),他们都知道这个中介机构。

然后,中介机构需要知道房主和租户,所以设置了mediator的houseOwner和tenant属性。

class MyClass
{public static void Main(string[] args){//一个房主、一个租房者、//一个中介机构MediatorStructure mediator = new MediatorStructure();//房主和租房者只需要知道中介机构即可HouseOwner houseOwner = new HouseOwner("张三", mediator);Tenant tenant = new Tenant("李四", mediator);//中介结构要知道房主和租房者mediator.houseOwner = houseOwner;mediator.tenant = tenant;tenant.Contact("需要租三室的房子");houseOwner.Contact("我这有三室的房子,你需要租吗?");}
}

🐳运行结果

🚀优缺点

优点:
  1. 它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义迭代器 的子类以支持新的遍历方式。
  2. 迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。
  3. 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足开闭原则的要求。
缺点:
  1. 增加了类的个数,这在一定程度上增加了系统的复杂性。
使用场景:
  1. 当需要为聚合对象提供多种遍历方式时。
  2. 当需要为遍历不同的聚合结构提供一个统一的接口时。
  3. 当访问一个聚合对象的内容而无须暴露其内部细节的表示时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】基本指令-入门级文件操作(一)

目录 前言 ⭕linux的树状文件结构 ⭕绝对路径和相对路径 ⭕当前路径和上级路径 ⭕隐藏文件 基本指令(重点) 1 pwd 指令 2 mkdir 指令 3 touch 指令 4 ls 指令 4.1 ls只加选项不加文件/目录名,默认查看当前目录下的文件 4.1.1 ls -a…

【香橙派-OpenCV-Torch-dlib】TF损坏变成RAW格式解决方案及python环境配置

前言 本文将介绍在香橙派(Orange Pi)开发板上进行软件配置和环境搭建的详细步骤,以便运行Python应用程序。这涵盖了以下主要内容: 获取所需软件:提供了香橙派操作系统和balenaEtcher工具的下载链接,以确保…

图片大小转换(对于图片进行压缩)

传入的是图片途径 import java.io.*; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.util.Base64;// 限制图像大小为4MB public byte[] limitImageSize(File imageFile, int maxSizeInBytes) throws IOException {if (imageFile.length() …

生成多元正态数据

目录 一、mvrnorm()函数使用介绍 例1:生成服从多元正态分布的数据 例2:生成一组服从多元正态分布的观测 一、mvrnorm()函数使用介绍 获取来自给定均值向量和协方差阵的多元正态分布的数据。 MASS包中的mvrnorm()函数可以让这个问题变得很容易,其调用…

win10搭建Selenium环境+java+IDEA(3)

这里主要对前面的maven和selenium做补充说明,以及更新一些pom文件下载依赖的问题。 IDEA里面,如果你创建的工程是maven工程文件,那么就会有一个pom.xml文件,可以在这个网站:https://mvnrepository.com/搜索依赖&#…

[PwnThyBytes 2019]Baby_SQL - 代码审计+布尔盲注+SESSION_UPLOAD_PROGRESS利用

[PwnThyBytes 2019]Baby_SQL 1 解题流程1.1 分析1.2 解题 2 思考总结 1 解题流程 1.1 分析 此题参考文章:浅谈 SESSION_UPLOAD_PROGRESS 的利用 访问正常来讲用ctf-wscan是能扫出source.zip文件的,且F12后提示了有source.zip,那我们就下载…

多项目并行管理:优化协调策略提高效率

多项目同时进行已然是大部分项目管理者面临的现状了。相比于单项目管理,多项目管理可能会出现项目资源分配不均,项目进度监控难以及沟通协作复杂等问题。 可以通过一款灵活高效得项目管理工具,来帮助您进行多项目管理,比如 Zoho …

文件解析的方法与原理

文件的解析使用python的struct模块,接下来会用到的2个方法: 解包unpack()方法 : 使用该方法可以从写好的二进制文件中读出文件。它的函数原型为:struct.unpack(fmt,string),fmt参数是格式字符串。string表示要转换的python值。最终函数返回一个元组。 calcsize()方法 : 该方法用…

美容类产品找什么渠道做推广比较好,媒介盒子告诉你

哈喽,大家好,今天媒介盒子小编又来跟大家分享软文推广的干货知识了,本篇分享的主要内容是:美容类产品找什么渠道做推广比较好~ 随着如今生活条件的进步,越来越多人的女性开始注重对自身的保养。她们会在市场上搜罗大量的美容护肤类服务和产品,这也给了无…

MFC文本输出学习

void CTxttstView::OnDraw(CDC* pDC) {CTxttstDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;pDC->SetBkColor(RGB(0,0,0));pDC->TextOut(50, 50, "一段文字");pDC->SetBkColor(RGB(255,255,255))…

【MySQL】基本查询(三)聚合函数+group by

文章目录 一. 聚合函数二. group by子句结束语 建立如下表 //创建表结构 mysql> create table exam_result(-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment 同学姓名,-> chinese float default 0.0 comment 语文成绩,->…

基于地理位置的IP地址定位技术

IP地址定位是指通过互联网上的IP地址,准确地定位出该IP地址对应的物理位置。IP地址是互联网上设备之间通信时使用的一个地址标识符,每个设备都有一个唯一的IP地址。 IP地址定位的原理是通过收集和分析网络设备的IP地址和相应的网络数据,以确定…

华为云云耀云服务器L实例评测|测试CentOS的网络配置和访问控制

目录 引言 1 理解几个基础概念 2 配置VPC、子网以及路由表 3 配置安全组策略和访问控制规则 3.1 安全组策略和访问控制简介 3.2 配置安全组策略 3.3 安全组的最佳实践 结论 引言 在云计算时代,网络配置和访问控制是确保您的CentOS虚拟机在云环境中安全运行的…

淘宝商品链接获取淘宝商品详情数据(用 Python实现淘宝商品信息抓取)

在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取淘宝多网站上的商品页面。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是,淘宝网…

Python中如何快速解析JSON对象数组

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 由于浏览器可以迅速地解析JSON对象,它们有助于在客户端和服务器之间传输数据。 本文将描述如何使用Python的JSON模块来传输和接收JSON数据。 JavaSc…

【JavaEE】多线程(五)- 基础知识完结篇

多线程(五) 文章目录 多线程(五)volatile关键字保证内存可见性JMM(Java Memory Model) 不保证原子性 wait 和 notifywait()notify()线程饿死 上文我们主要讲了 synchronized以及线程安全的一些话题 可重入…

故障注入常用方法有哪些 其重要性是什么

故障注入是一种有效的测试方法,可用于评估系统对异常情况的响应。通过这种测试方法,可以发现系统中的潜在问题,并采取适当措施来改进系统的质量和性能。本文将介绍故障注入常用方法及重要性! 一、故障注入常用方法 1、随机故障注入&#xff1…

《向量数据库指南》——向量数据库 有必要走向专业化吗?

向量数据库 有必要走向专业化吗? 向量数据库系统的诞生,来源于具体业务需求——想要高效处理海量的向量数据,就需要更细分、更专业的数据基础设施,为向量构建专门的数据库处理系统。 但这种路径是必须的吗? 从产品层面讲,如果传统数据库厂商不单独研发向量数据库,那么…

Postgresql中的C/C++混编(JIT)

1 Postgresql编译JIT 整体上看使用了GCC、G编译文件,最后用G汇总: GCC编译的三个.o文件llvmjit、llvmjit_deform、llvmjit_expr llvmjit.c -> llvmjit.o gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -…

Unity布料系统Cloth

Unity布料系统Cloth 介绍布料系统Cloth(Unity组件)组件上的一些属性布料系统的使用布料约束Select面板Paint面板Gradient Tool面板 布料碰撞布料碰撞碰撞适用 介绍 布料系统我第一次用是做人物的裙摆自然飘动,当时我用的是UnityChan这个unity官方自带的插件做的裙摆…