【设计模式】—— 中介者模式Mediator

  前言:【模式总览】——————————by xingoo

  模式意图

  使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合。

  这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与活动的对象了如指掌!

  应用场景

  1 当一组对象要进行沟通或者业务上的交互,但是其关系却又很复杂混乱时,可以采用此模式。

  2 当一个对象与其他的对象要进行紧密的交互,但又想服用该对象而不依赖其他的对象时。

  3 想创造一个运行于多个类之间的对象,又不想生成新的子类时。

  模式结构

  

  Mediator 抽象的中介者,定义中介的规范

interface Mediator{public void colleagueChanged(Colleague c);
}

  ConcreteMediator 具体的中介者,通常内部依赖于多个业务对象

class ConcreteMediator implements Mediator{private Colleague1 col1;private Colleague2 col2;public void colleagueChanged(Colleague c) {col1.action();col2.action();}public void createConcreteMediator() {col1 = new Colleague1(this);col2 = new Colleague2(this);}private Colleague1 getCol1() {return col1;}public Colleague2 getCol2() {return col2;}
}

  Colleague 抽象的业务角色

abstract class Colleague{private Mediator mediator;public Colleague(Mediator mediator){this.mediator = mediator;}public Mediator getMediator() {return mediator;}public abstract void action();public void change(){mediator.colleagueChanged(this);}
}

  Colleague1 Colleague2 具体的业务角色

class Colleague1 extends Colleague{public Colleague1(Mediator m){super(m);}public void action(){System.out.println("this is an action from Colleague1");}
}
class Colleague2 extends Colleague{public Colleague2(Mediator m){super(m);}public void action(){System.out.println("this is an action from Colleague2");}
}

  全部代码

 1 package com.xingoo.test.design.mediator;
 2 abstract class Colleague{
 3     private Mediator mediator;
 4     
 5     public Colleague(Mediator mediator){
 6         this.mediator = mediator;
 7     }
 8     
 9     public Mediator getMediator() {
10         return mediator;
11     }
12     
13     public abstract void action();
14     
15     public void change(){
16         mediator.colleagueChanged(this);
17     }
18 }
19 class Colleague1 extends Colleague{
20     public Colleague1(Mediator m){
21         super(m);
22     }
23     public void action(){
24         System.out.println("this is an action from Colleague1");
25     }
26 }
27 class Colleague2 extends Colleague{
28     public Colleague2(Mediator m){
29         super(m);
30     }
31     public void action(){
32         System.out.println("this is an action from Colleague2");
33     }
34 }
35 interface Mediator{
36     public void colleagueChanged(Colleague c);
37 }
38 class ConcreteMediator implements Mediator{
39     private Colleague1 col1;
40     private Colleague2 col2;
41     
42     public void colleagueChanged(Colleague c) {
43         col1.action();
44         col2.action();
45     }
46     
47     public void createConcreteMediator() {
48         col1 = new Colleague1(this);
49         col2 = new Colleague2(this);
50     }
51     
52     private Colleague1 getCol1() {
53         return col1;
54     }
55     
56     public Colleague2 getCol2() {
57         return col2;
58     }
59     
60 }
61 
62 public class Client {
63     public static void main(String[] args) {
64         ConcreteMediator mediator = new ConcreteMediator();
65         mediator.createConcreteMediator();
66         Colleague1 col1 = new Colleague1(mediator);
67 //        Colleague2 col2 = new Colleague2(mediator);
68         mediator.colleagueChanged(col1);
69     }
70 }
View Code

  运行结果

this is an action from Colleague1
this is an action from Colleague2

 

  生活中的设计模式

  

 

  毕业的同学们,第一个要解决的问题就是租房子,当白富美高富帅出没社会后,穷屌丝没了生存之地。但是只要勤劳,一样有饭吃有房住!

  这里房屋中介好比是一个中介者,它知道每个租客的身份信息,当有房屋出租后,它会发送给每一个租客消息。

  这样,租客们中有一个变化活动时,都会利用房屋中介,发送消息到其他的租客。下面就是模仿的一个过程。

  房屋中介代码如下:

 1 interface StateMediator{
 2     public void sell(Tenant tenant);
 3 }
 4 class RealEstateAgents implements StateMediator{
 5     private TenantA teA;
 6     private TenantB teB;
 7     private TenantC teC;
 8     
 9     public void sell(Tenant tenant) {
10         System.out.println("海景洋房 已经租出去了!");
11         if(tenant instanceof TenantA){
12             teB.crying();
13             teC.crying();
14         }else if(tenant instanceof TenantB){
15             teA.crying();
16             teC.crying();
17         }else if(tenant instanceof TenantC){
18             teB.crying();
19             teA.crying();
20         }
21     }
22     
23     public void createAgents(){
24         teA = new TenantA(this);
25         teB = new TenantB(this);
26         teC = new TenantC(this);
27     }
28 }

  租客的代码如下:

 1 abstract class Tenant{
 2     private RealEstateAgents agent;
 3     public Tenant(RealEstateAgents agent) {
 4         this.agent = agent;
 5     }
 6     public abstract void crying();
 7     public void renting(){
 8         agent.sell(this);
 9     }
10 }
11 class TenantA extends Tenant{
12     public TenantA(RealEstateAgents agent) {
13         super(agent);
14     }
15     public void crying() {
16         System.out.println("我是高富帅 TenantA!哎呀我想要!");
17     }
18 }
19 class TenantB extends Tenant{
20     public TenantB(RealEstateAgents agent) {
21         super(agent);
22     }
23     public void crying() {
24         System.out.println("我是白富美 TenantB!哎呀我想要!");
25     }
26 }
27 class TenantC extends Tenant{
28     public TenantC(RealEstateAgents agent) {
29         super(agent);
30     }
31     public void crying() {
32         System.out.println("我是穷屌丝 TenantC!哎呀我想要!");
33     }
34 }

  产生的业务活动如下:

 1 public class ClientTest {
 2     public static void main(String[] args) {
 3         RealEstateAgents agent = new RealEstateAgents();
 4         agent.createAgents();
 5         
 6         System.out.println("TeA 抢到了房子了!");
 7         agent.sell(new TenantA(agent));
 8         
 9         System.out.println("过了两个月 TeB 抢到了房子了!");
10         agent.sell(new TenantB(agent));
11     }
12 }

  运行结果

TeA 抢到了房子了!
海景洋房 已经租出去了!
我是白富美 TenantB!哎呀我想要!
我是穷屌丝 TenantC!哎呀我想要!
过了两个月 TeB 抢到了房子了!
海景洋房 已经租出去了!
我是高富帅 TenantA!哎呀我想要!
我是穷屌丝 TenantC!哎呀我想要!

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

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

相关文章

mysql数据库主要用来做什么的_水晶头骨用来做什么的?

1927年一个小女孩在挖掘时,发现了一颗人头骨。这颗头骨是用水晶做成的,之后关于水晶头骨之谜一直被人津津乐道,人们一直在猜测水晶头骨用来做什么的?一共有多少个?在小女孩挖到这颗头骨之前,大英博物馆里就…

日本画风超级“诡异”毕业典礼上线,网友:有被吓到,谢谢!

转眼间又到了日本毕业季,四月份本来是日本毕业季。在日本,毕业季是非常仪式感的存在:学校里会满是穿着浴衣、盛装打扮的小哥哥小姐姐,拿着毕业证书,在樱花树下合照。图片来源:日剧《对不起,青春…

博客编辑工具ckeditor

在asp网站开发过程当中常常用到漂亮的编辑工具。 在这个网站有不少:http://ckeditor.com/ 而且下载下来就可以使用,是开源的。它不像asp里面的.dll控件拖进来就可以使用,而是通过调用的方式使用。 下载下来解压之后就可以直接包含在项目中&am…

记一次 .NET 某流媒体独角兽 API 句柄泄漏分析

一:背景 1. 讲故事上上周有位朋友找到我,说他的程序CPU和句柄都在不断的增长,无回头趋势,查了好些天也没什么进展,特加wx寻求帮助,截图如下:看的出来这位朋友也是非常郁闷,出问题还出…

iphone最新款手机_苹果罕见“跌停”!遭遇6年来最惨淡一夜,2019年全球股市第一颗雷引爆...

2019年全球股市的第一颗大雷引爆了。受苹果下调营收预期影响,周四盘中,苹果股价一度跌至142.08美元,创逾一年半新低,日内跌幅超过10%,市值缩水750亿美元。最终,苹果收跌9.96%,创出自2013年1月以…

MVC学习之分页 【转】

分页如果dinners列表记录过多,为了让用户更方便浏览,我们需要实现分页显示,而不是一次显示大量的记录列表。Index() Action方法更新DinnersController类的Index() action方法代码如下://// GET: /Dinners/public ActionResult Ind…

构件图

构件图 目录 构件图概要... 1 构件图中的事物及解释... 1 构件图中的关系及解释... 1 我的构件图... 1 构件图用于静态建模,是表示构件类型的组织以及各种构件之间依赖关系的图。构件图通过对构件间依赖关系的描述来估计对系统构件的修改给系统可能带来的影响…

不小心把硬盘摔了一下,结果电脑变成这样了......

1 会主动要求换尿裤的小宇航员▼2 其实赚钱这个事儿我也不太会▼3 春困、夏倦、秋乏、冬眠一年四季都好适合睡觉啊!▼4 这是硬盘摔了,结果把显示器心疼坏了吧?▼5 柯基:弱小、可怜▼6 朋友相册里的你▼7 人类迷惑行为之放生…

win10前置耳机插孔没声音_音频服务未运行怎么办?win7和win10电脑没声音了恢复方法...

很多人可能都会问电脑没声音了,如何恢复?其实造成这种情况的原因有很多,一般需要一个一个排查。这次,小编跟大家分享其中的一个原因,以及具体的解决方法。个别小伙伴的笔记本电脑,每次开机总会提示音频服务…

开源 java CMS - FreeCMS2.2 系统配置

2019独角兽企业重金招聘Python工程师标准>>> 项目地址:http://www.freeteam.cn/ 系统配置 管理系统使用的配置项。 从左侧管理菜单点击系统配置进入。 从FreeCMS 1.7开始支持 数据变更后栏目页面静态化间隔时间(单位为分):修改栏目、更新…

EF Core使用Simple Logging输出日志

在使用EF Core的时候,很多时候需要知道EF Core实际执行的SQL语句是什么。Simple Logging是EF Core提供的一项功能,可用于在开发和调试应用程序时轻松获取日志。这种形式的日志记录需要最少的配置,而不需要其他NuGet包。功能一瞥配置起来非常简…

如何用全球顶级名画,成为全行业最令人羡慕的人?

▲ 点击查看马克思曾说:“如果你想得到艺术的享受,那你就必须是一个有艺术修养的人。”假如现在有下面两幅画,站在艺术的角度上,你会选择哪个呢?或者我们可以换一个问法:哪一种猫才是最符合你心中标准的猫&…

电脑启动后黑屏只有鼠标_电脑加装固态硬盘后出现黑屏或蓝屏解决方案

以下内容以本人遇到的真实问题为例,从找到加装固态硬盘后出现黑屏及蓝屏的原因,到成功解决问题,请各位看官听我娓娓道来,也希望为遇到同样问题的广大网友拨云见日,废话不多说,走起……一、问题描述:1. 背景…

2021编程语言排行:C#飙升,Python蝉联榜首

文 | 白开水不加糖出品 | OSC开源社区(ID:oschina2013)IEEE Spectrum 2021 年度编程语言排行榜现已发布。该榜单一年发布一次,今年是其发布的第八年。今年的排行榜包含 55 种语言,其排序综合 8 个重要线上数据源的 11 …

GitHub中教程资源 | 共21个图形绘制教程

一边学习,一边总结,一边分享! 写在前面 今天分享在GitHub中找到的教程资源,此教程是来自iMeta期刊及“农心生信工作室”的作品。发表在GitHub中,大家可以自行下载。 包含了21个图形的绘制,我大体看了一下…

盘点那些欺骗我感情的数学定理

全世界只有3.14 % 的人关注了爆炸吧知识一直以来,关于定理、公式的命名,人们都倾向于用数学家的名字命名,不仅简单方便,还可以达到纪念创立人的效果。不过,也不是每一次都这么好的,超模君发现,有…

linux启动mysql_Linux服务器安装Mysql教程

最开始用服务器的时候,也是对这些环境的安装操作极其陌生,找了很多方式,写这边文章就是为了让更少的童鞋走弯路,下面我们看看具体的操作流程。1、首先关闭linux的防火墙,执行命令chkconfig iptables off2、从mysql官网…

黑人抬棺,虽迟但到

1 脑子里有声音了▼2 人活着可太难了▼3 受疫情影响,汤姆哈迪在家种菜了▼4 4岁小朋友的涂鸦对颜色搭配的天赋简直点满▼5 白天哈哈哈哈哈哈哈哈晚上呜呜呜呜呜呜呜呜▼6 反正是最后的晚餐了通融一下嘛▼7 喵娘报恩▼你点的每个赞,我都认真当成了…

本地搭建K8s环境,并配置Ingress代理(1)

书接上文,上回说到了在Linux系统搭建K8s环境,通过脚本一键处理,具体可参考《入门K8s:一键脚本搭建Linux服务器集群》。虽然Linux系统很不错,而且也推荐都买一个做练习,但是不可避免的会遇到一些小问题&…

简单链接Simplelink 传感器标签SensorTag

2019独角兽企业重金招聘Python工程师标准>>> 传感器标签现在支持iBeacon技术 为了让你的传感器标签升级到与iBeancon技术兼容,你需要和苹果公司签约一个iBeacon许可,然后你可以请求访问软件,通过点击这里http://www.ti.com/tool/s…