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工具的下载链接,以确保…

flutter实现透明appbar(一)

前言 在项目中如何实现透明的appbar,方式一: 使用stack和positioned定位功能把appbar定位到页面的最上面, 实现 实现 Widget build(BuildContext context) {return Scaffold(body: Stack(children: [_homePage(), _appBar()],),);}_appbar…

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

传入的是图片途径 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() …

BuyVM 拉斯维加斯 VPS 测评

description: 发布于 2023-07-05 BuyVM 拉斯维加斯 VPS 测评 产品链接:https://my.frantech.ca/cart.php?gid37 G口不限制流量,抗一般投诉,不抗版权投诉。 中国大陆连通性尚可。 CPU,硬盘速度不错。 规格 $3.50 USD/mo 1G…

js验证字符串是否是时间日期格式

参考文章 验证字符串是否是时间日期格式 返回 布尔值 表示 Dayjs的日期是否通过校验。 不严格的校验 只检查传入的值能否被解析成一个时间日期 dayjs(2022-01-33).isValid(); // true, parsed to 2022-02-02dayjs(some invalid string).isValid(); // false严格校验 检查…

vue中使用ali-oss上传文件到阿里云上

1.使用 npm 安装ali-oss npm install ali-oss --save2.写ali-oss.js // 引入ali-oss let OSS require(ali-oss) let client new OSS({region: oss-cn-xxx, // bucket所在的区域, 默认oss-cn-hangzhousecure: true, // secure: 配合region使用,如果指…

生成多元正态数据

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

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

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

【API要返回一棵树的结构】数据库表结构是平铺的数据,但是api要实现树状结构展示。api实现一棵树的结构,如何实现呢,递归?如何递归呢

数据库中的数据是平铺的&#xff0c;一行行的&#xff0c;但是api要查询出来的数据要求是一棵树的结构&#xff0c; 怎么把平铺的数据转换成树状结构呢&#xff1f; public List<CarbonRepo> findCarbonRepo(Integer type){// 1. 先查出所有数据。 baseFindList 方法就是…

基于Keil a51汇编 —— 程序模板文件以及规则

程序模板文件 下面的代码模板包含有关如何编写自己的程序集模块的指南和提示。此模板文件模板。A51 在文件夹 \C51\ASM 中提供。 $NOMOD51 ; 禁用预定义的 8051 寄存器 #include <reg52.h> // 包含头文件; ;根据需要更改小写名称。 ;该汇编模板让你…

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

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

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

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

文件解析的方法与原理

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

【原理学习】互斥量机制与条件变量机制一起使用

互斥量机制 互斥量是多线程机制的一种。互斥量&#xff08;Mutex&#xff09;是一种用于实现线程互斥访问共享资源的机制&#xff0c;通过互斥量可以保证在同一时间内只有一个线程可以访问共享资源&#xff0c;从而避免多线程并发修改共享资源导致的数据不一致问题。 在多线程…

libgedit-amtk和amtk冲突不能升级

[SOLVED] Cant update the system / Pacman & Package Upgrade Issues / Arch Linux Forums sudo pacman -Rd amtk 单独删除 amtk 包就行了。

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

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

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))…

深入浅出:react高阶成分(HOC)的应用

React中的HOC&#xff08;Higher-Order Component&#xff09;是一种高阶组件的模式&#xff0c;它是一个函数&#xff0c;接收一个组件作为参数&#xff0c;并返回一个新的包装组件。HOC可以用于增强组件的功能&#xff0c;例如添加属性、处理生命周期方法、共享状态等。 HOC…

【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 语文成绩,->…