场景:与朋友通信件

描述:东北的赵大宝向山东水泊梁山的好汉王英寄了一封信

(一)实体类(用于维持数据)

public class User

{

public string Address { get; set; }

public string PostCode { get; set; }

public string Name { get; set; }

}

(二)赵大宝与王英(同事关系)抽象接口

public interface IPerson

{

User Sender{get;set;}

User Receiver{get;set;}

}

收信人的地址信息,与寄信的地址信息

(三)赵大宝

public class Zhao : IPerson

{

#region IPerson 成员

public User Sender

{

get;

set;

}

public User Receiver

{

get;

set;

}

#endregion

}

(四)王英

public class Wang : IPerson

{

#region IPerson 成员

public User Sender

{

get;

set;

}

public User Receiver

{

get;

set;

}

#endregion

}

(五)中介者抽象

public abstract class Mediator

{

public abstract void Send();

public abstract void Receive();

public abstract void Register(IPerson person);

}

注册收信人与寄信人,可以把本地信件发往各地(Send),也可以接收从其它各地寄往本地的信件(Receive)

(六)本地邮局(中介者实现)

public class Postoffice : Mediator

{

private User _sender;

private User _receiver;

public override void Send()

{

if (_receiver != null)

{

Console.WriteLine("向住在"+_receiver.Address+"的" + _receiver.Name + "寄了一封信!"+"邮编是"+_receiver.PostCode);

}

else

Console.WriteLine("没有信件邮寄!");

}

public override void Receive()

{

if (_sender != null)

{

Console.WriteLine("收到住在" + _sender.Address + "的" + _sender.Name + "寄来的一封信!" + _sender.PostCode);

}

else

Console.WriteLine("没有收到信件!");

}

public override void Register(IPerson person)

{

_sender = person.Sender;

_receiver = person.Receiver;

}

}

(七)测试

public void TestMediator()

{

IPerson zhao = new Zhao();

User _zhao = new User { Name="赵大宝", Address="东北某地", PostCode="1212121" };

User _wang = new User {Name="王英",Address="山东梁山泊",PostCode="3636363" };

zhao.Sender = _zhao;

zhao.Receiver = _wang;

Mediator mdor = new Postoffice();

mdor.Register(zhao);

mdor.Send();

mdor.Receive();

}

东北的赵大宝向山东的王英寄了一封信……

结果:

向住在山东梁山泊的王英寄了一封信!邮编是3636363
收到住在东北某地的赵大宝寄来的一封信!1212121

中介者模式要求每个同事都知道中介者,但这种方式实现,我觉得也可以。

以下是正常实现方式

(一)   实体类

用于维持数据

public class User

{

public string Address { get; set; }

public string PostCode { get; set; }

public string Name { get; set; }

}

(二)   同事抽象接口

public abstract class Person

{

protected Mediator _mediator;

User Sender { get; set; }

User Receiver { get; set; }

public abstract void SetMediator(Mediator mediator);

public abstract void Send();

}

(三)   寄信人

public class People : Person

{

public User Sender

{

get;

set;

}

public User Receiver

{

get;

set;

}

public override void SetMediator(Mediator mediator)

{

_mediator= mediator;

}

public override void Send()

{

_mediator.Send(Sender, Receiver);

}

}

(四)   中介者抽象

public abstract class Mediator

{

public abstract void Send(User sender, User receiver);

}

(五)   本地邮局(中介者实现)

public class Postoffice : Mediator

{

public override void Send(User sender, User receiver)

{

Console.WriteLine(sender.Name+"向住在" +

receiver.Address + "的" + receiver.Name + "寄了一封信!"

+ "邮编是" + receiver.PostCode);

}

}

(六)   测试

public void TestMediator()

{

Postoffice post = new Postoffice();

People z1 = new People();

z1.SetMediator(post);

User _zhao = new User { Name = "赵大宝", Address = "东北某地", PostCode = "1212121" };

User _wang = new User { Name = "王英", Address = "山东梁山泊", PostCode = "3636363" };

z1.Sender = _zhao;

z1.Receiver = _wang;

z1.Send();

}

东北的赵大宝向山东的王英寄了一封信……

结果:

赵大宝向住在山东梁山泊的王英寄了一封信!邮编是3636363

在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。

在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。

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

要点:

1,将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关系”为多“个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。

2,随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。 这时候可以对Mediator对象进行分解处理。

3,Facade模式是解耦系统外到系统内(单向)的对象关系关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。

众多的对象间相互关联,相互交互,它们之间常维持着一种复杂的引用关系,把关联关系抽象出来,使众多对象间的相互关联相互交互转为众多对象与中间人关联,做为中转站。在这个例子中,人与人之间的信件往来是多多关联的,且每个人执行各自的信件往来功能(我猜想最早的信件往来是以人带捎的形式实现的,不会自己写的信,自己送吧。而这一具体的事物在一开始便是这种模式的最好体现)。

信件往来中有3个对象:送信的,收信的,邮局。邮局来实现关联对象的功能:寄,收。

模式实例之——中介者实例相关推荐

  1. 手把手教你应用三种工厂模式在SpringIOC中创建对象实例【案例详解】

    目录 一.工厂模式介绍 二.通过静态工厂方法创建Bean实例 三.通过实例工厂方法创建Bean实例 四.通过自定义的factoryBean来创建bean对象 Hello,你好呀,我是灰小猿!一个超会写 ...

  2. C# EF Core 简单工厂模式,接口多继承实例(三)

    一.说明 1.本实例是基于.Net Core 1.1,EF Core 1.1的代码实例,仅供参考 2.当前版本的EF Core好像还没有提供模型验证,异常跟踪等 二.实体层,自动 生成 三 .接口层 ...

  3. 调节效应与中介效用实例讲解

    调节效应与中介作用实例讲解

  4. RAC 实例 迁移到 单实例 -- 使用导出导入

    昨天整理做了用导出导入的方法,将Oracle 单实例 迁移到 RAC 实例的实验. 今天来做一个用导出导入的方法将RAC 实例迁移到 Oracle 单实例. 方法都差不多. 只不过顺序倒过来了. Or ...

  5. mysql实例怎么复制_Mysql实例MySQL数据库复制概论

    <Mysql实例MySQL数据库复制概论>要点: 本文介绍了Mysql实例MySQL数据库复制概论,希望对您有用.如果有疑问,可以联系我们. 导读:每当我们讨论一项(新的)领域技术的时候, ...

  6. php rsa加密实例,php实现RSA加密类实例,phprsa加密实例_PHP教程

    php实现RSA加密类实例,phprsa加密实例 本文实例讲述了php实现RSA加密类.分享给大家供大家参考.具体分析如下: 通过openssl实现的签名.验签.非对称加解密,需要配合x.509证书( ...

  7. 正则表达式实例搜集,通过实例来学习正则表达式

    正则表达式实例搜集,通过实例来学习正则表达式.本仓库实例搜集整理来自于<一些正则表达式随记>,通过一个单独仓库专门整理这些正则实例,提供一个实例网站,方便正则实例验证和查询.也方便添加新的 ...

  8. mysql模糊查询实例_Mysql实例sql模糊查询实例详解

    <Mysql实例sql模糊查询实例详解>要点: 本文介绍了Mysql实例sql模糊查询实例详解,希望对您有用.如果有疑问,可以联系我们. 导读:常用的模糊查询语句:select 字段 fr ...

  9. EC2实例和新I2实例介绍

    EC2实例概况 Amazon EC2 实例是 亚马逊云科技云服务中提供计算功能的最基本构建模块.你可以把EC2实例当作可以运行应用程序的虚拟服务器或者是云主机.EC2实例需要通过亚马逊系统映像 (AM ...

  10. ODrive实例 #2 电机配置实例(小米9号平衡车轮毂电机)

    ODrive实例 #2 电机配置实例(小米9号平衡车轮毂电机) 以下内容将详细介绍使用 ODrive 驱动无刷电机的过程,如果您的硬件和本文中所使用的一样的话,配置参数按照本文中的配置即可达到同样的效 ...

最新文章

  1. SHOW PROCESSLIST 命令详解 (查看锁表)
  2. 珠海网络推广浅析网站优化面对搜索引擎算法更新怎样才能应对自如?
  3. uboot和linux内核移植,Uboot与kernel移植总结
  4. pip更新失败_最全Tensorflow2.0 入门教程持续更新
  5. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)
  6. 上接游戏人生Silverlight(2) - 趣味钢琴[Silverlight 2.0(c#)]
  7. SharePoint三个主要数据库
  8. vue form validate 多个input_Vue表单校验插件Vuerify使用详细教程及示例
  9. 人们的Live Meeting系列 (floyd)
  10. python 比较两文件夹的内容,具有通用性。
  11. ZZNUOJ_C语言1047:对数表(完整代码)
  12. pd调节规律_PID调节规律总结
  13. 什么是OA系统?OA系统的协同门户平台有哪些特点?
  14. kubernetes日志架构PLG(promtail+loki+grafana)
  15. PL2303在ARM Linux下驱动的问题及解决方法
  16. 4.5 函数最佳逼近
  17. 利用PyDoc查看python文档及生成HTML
  18. AS2:实现右滑删除,点击展开及点击跳转
  19. vue实例中template: App,这样写是什么意思
  20. JSON是什么,主要用来做哪方面的工作?

热门文章

  1. overridden/inherited关键字的读书笔记
  2. 标准代码页(codepage)列表
  3. SpringMvc @PathVariable 工作原理
  4. 排序算法——直接选择排序
  5. ffmpeg怎么样处理网络流
  6. 软件的一些标号及对应版本
  7. jquery on() 转
  8. JQuery 技巧大方送
  9. 8-4 如何使用线程本地数据
  10. 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈