文章目录

  • 简介
  • 伪代码演示
  • 简单实现
  • 使用MediatR实现中介者模式
  • 来源

简介

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用:多个类相互耦合,形成了网状结构。

如何解决:将上述网状结构分离为星型结构。

关键代码:对象 Colleague 之间的通信封装到一个类中单独处理。

应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

缺点:中介者会庞大,变得复杂难以维护。

使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项:不应当在职责混乱的时候使用。

伪代码演示

中介者模式就是通过一个中介者,来让多个交错纵横的引用的类相互解耦,通过访问中介者类的方法就可以访问其他类的方法,每个类之间是相互平等的。比如下面的代码,我们有一个学生类,一个教师类,我们在控制器中有两个Action来处理这两个类的新增,那我们的实现应该是如下的:

public class Student{//属性...}
public class Teacher{//属性...}

服务类

public class StudentService
{public void Add(Student entity){//添加方法}
}
public class TeacherService
{public void Add(Teacher entity){//添加方法}
}

控制器的实现,可以看到有多个服务类被实例化。

public class AddController : Controller
{StudentService studentService = new StudentService();TeacherService teacherService = new TeacherService();public IActionResult Student(Student entity){studentService.Add(entity);return Content("添加成功");}public IActionResult Teacher(Teacher entity){teacherService.Add(entity);return Content("添加成功");}
}

如果我们用了中介者模式,那就可以免去这些服务类的实例化,直接使用中介者类执行对应的添加方法就行了,下面就进行简单的实现。

简单实现

下面只是通过简单的例子来体现中介者模式的思想,不用过于纠结是否合理,我们可以在实际项目中按自己的需求来实现,就想上面描述的广义的中介者模式。

学生类和教师类以及对应的服务类

public class Base{}
public class Student : Base{//属性...}
public class Teacher : Base{//属性...}
public class StudentService
{public string Add(Student entity){return "已添加学生";}
}
public class TeacherService
{public string Add(Teacher entity){return "已添加教师";}
}

中介者类

public interface IMediator{string Add(Base entity);}
public class Mediator : IMediator
{private StudentService studentService = new StudentService();private TeacherService teacherService = new TeacherService();public string Add(Base entity){if(entity is Student)return studentService.Add((Student)entity);else if (entity is Teacher)return teacherService.Add((Teacher)entity);return "添加失败";}
}

控制器中使用中介者类

public class AddController : Controller
{private IMediator iMediator = new Mediator();public IActionResult Student(Student entity){return Content(iMediator.Add(entity));}public IActionResult Teacher(Teacher entity){return Content(iMediator.Add(entity));}
}

访问学生新增接口就会出现如下结果:

使用MediatR实现中介者模式

通过 .NET CORE 自带的 IoC 注入

引用 MediatR nuget:install-package MediatR

引用IOC扩展 nuget:installpackage MediatR.Extensions.Microsoft.DependencyInjection //扩展包

在Startup类中的ConfigureServices方法中注册MediatR服务,下面这句话可以扫描继承IRequestHandler接口的实现对象并添加到IOC的容器中

services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly);

为我们的学生类和教师类继承IRequest接口,表示该对象是处理器的一个对象。

public class Student : IRequest<string>{//属性...}
public class Teacher : IRequest<string>{//属性...}

为我们的服务类添加IRequestHandler接口创建处理器对象。

public class StudentService : IRequestHandler<Student,string>
{public Task<string> Handle(Student entity, CancellationToken cancellationToken){return Task.FromResult("已添加学生");}
}
public class TeacherService : IRequestHandler<Teacher, string>
{public Task<string> Handle(Teacher entity, CancellationToken cancellationToken){return Task.FromResult("已添加教师");}
}

在控制器中使用,通过调用中介者的Send方法,自动匹配对应使用该处理器对象的处理器方法。

public class AddController : Controller
{private readonly IMediator _mediator;public AddController(IMediator mediator){_mediator = mediator;}public IActionResult Student(Student entity){return Content(_mediator.Send(entity).Result);}public IActionResult Teacher(Teacher entity){return Content(_mediator.Send(entity).Result);}
}

这样我们的改造就完成了。继承IRequest接口有一个泛型表示处理器返回参数类型,与IRequestHandler接口的第二个参数和IRequestHandler接口定义的方法Handle方法的返回值对应,可以不定义表示返回void。IRequestHandler接口的第一个参数必须为继承IRequest接口的类。

来源

中介者模式|菜鸟教程
中介者模式及在NetCore中的使用MediatR来实现

【23种设计模式】中介者模式(Mediator Pattern) .Net Core实现相关推荐

  1. 设计模式-中介者模式(Mediator Pattern)

    设计模式-中介者模式(Mediator Pattern) 文章目录 设计模式-中介者模式(Mediator Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.总 ...

  2. 23种设计模式----中介者模式----行为型模式

    中介者模式 1.什么是中介者模式 2.中介者模式的角色 3.例子 3.1 项目结构 3.2 共同实体 3.3 抽象的中介者 3.4 抽象的被中介者 3.5 具体的中介者 3.6 具体的被中介者 3.7 ...

  3. 23种设计模式——中介者模式

    引言: 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 中介者模式的定义: 从生活中的例 ...

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

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

  5. PHP设计模式之中介者模式(Mediator Pattern)了解下

    咱们先来看下中介者模式(Mediator Pattern)的定义,它就是,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互, ...

  6. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  7. 【23种设计模式】观察者模式(Observer Pattern)

    个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客:这里是CSD ...

  8. java中介者模式例子_Java中介者模式(Mediator Pattern)

    本篇文章帮大家学习java中介者模式(Mediator Pattern),包含了Java中介者模式(Mediator Pattern)使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以 ...

  9. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

最新文章

  1. FPGA笔试题解析(三)
  2. 盘点JavaScript函数的基本知识
  3. 人工智能缺陷与误觉:让机器产生幻觉的「怪异事件」 1
  4. spark分区增减、JavaFX基本操作和HDFS NN DN概念
  5. 信息学奥赛一本通(1154:亲和数)
  6. 嵌入式Linux入门4:版本控制git的使用
  7. java外部工具配置_eclipse配置外部工具利用javah编译生成头文件
  8. 厉害了!浙大研发出踹不倒四足机器人“绝影”,中国版波士顿动力来了
  9. 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段
  10. springmvc+ueditor上传路径(个人备忘)
  11. php move函数,php – 在null上调用成员函数move()
  12. ALSA之Codec注册过程
  13. 吴伯凡-认知方法论-你心之外无世界
  14. 红外测温之MLX90614教程
  15. XGBoost 与 信用卡诈骗数据集 二
  16. 七天玩转Redis | Day5、Java操作Redis
  17. Android 关于所谓的 深度睡眠 的问题
  18. office文件图标显示不正常
  19. 小何的第一篇博客+GitHub的基本设置
  20. PHP还款,ThinkPHP内核借贷管理系统安装版

热门文章

  1. Learning with Errors
  2. void* to ULONG
  3. 命名规则之大驼峰命名法和小驼峰命名法
  4. ubuntu 回到根目录,回到上一级 常用指令
  5. 获取checkbox中被选中的值
  6. 国产服务器芯片性能如何,如何挑选国产芯片服务器
  7. [易飞]录入信息传递设置信息
  8. python 学习之Windows 下的编码处理!
  9. python中search、findall、finditer的区别
  10. 荣之学教育简述Shopee虾皮账号被冻结,最常见的2种原因