中介者模式

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

23种设计模式

1.什么是中介者模式

在幼儿园,小朋友在课间总是说个不停,但是由于每个人都在吵,老师受不了了,老师说:谁想说话就举手,我提问谁谁需要回答。
在这种情况下:
老师就是中介者,小朋友就是被中介者。
中介者还有另一种说法:仲裁者。。。

2.中介者模式的角色

在1中我们说到,中介者模式有时又叫做仲裁者模式,为什么呢?

首先需要明白中介者模式的一些角色:

抽象的中介者(Mediator)
具体的中介者(ConcreteMediator)
抽象的被中介者(Colleague)
具体的被中介者(ConcreteColleague)

第一种:中介者

被中介者之间需要通信,但是被中介者相互调用,非常的复杂,那么被中介者之间通信通过中介者来进行,中介者做转发。

中介者收到被中介者的通信后,会做出响应,是转发还是不转发。。。。(转发就会调用目标被中介者的方法,不转发调用失败)

中介者将类之间的强关联通过转发方式转化为了弱关联。
一般是中介者关联被中介者的接口或者基类,这样扩展非常容易。

第二种:仲裁者

被仲裁者都有相同的方法需要执行,但是执行哪一个被仲裁者的方法?

仲裁者指定被仲裁者,被仲裁者执行自己的方法。。

3.例子

对于中介者:
学生a希望老师转达学生b一个消息
对于仲裁者:
老师随机提问一个学生,学生需要作出回答。

3.1 项目结构

3.2 共同实体

package domain;import java.io.Serializable;public class Info implements Serializable{private static final long serialVersionUID = 8468185044512901245L;private String name;private Integer age;private Boolean sex;public Info(String name,Integer age,Boolean sex){this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Boolean getSex() {return sex;}public void setSex(Boolean sex) {this.sex = sex;}}

3.3 抽象的中介者

package mediator.abs;import java.util.Observable;
import java.util.Observer;import domain.Info;public abstract class Teacher implements Observer{protected Info info;//提问被中介者public abstract void setFocus(Observable observable);//访问者模式的update方法就是中介者的仲裁方法public Teacher(Info info){this.info = info;}public Info getInfo() {return info;}public void setInfo(Info info) {this.info = info;}}

3.4 抽象的被中介者

package colleague.abs;import java.util.Observable;
import java.util.Observer;import domain.Info;public abstract class Student extends Observable {protected Info info;//绑定中介者public abstract void addTeacher(Observer teacher);//向中介者通信public abstract void inform(String msg);//删除中介者public abstract void delTeacher(Observer observer);//响应中介者的通信public abstract void answer();public Student(Info info){super();this.info = info;}public Info getInfo() {return info;}public void setInfo(Info info) {this.info = info;}}

3.5 具体的中介者

package mediator.impl;import java.util.Observable;import colleague.abs.Student;
import domain.Info;
import mediator.abs.Teacher;public class Teacher1 extends Teacher{public Teacher1(Info info) {super(info);System.out.println(info.getName()+":");System.out.println("生成老师");System.out.println("创建中介者");System.out.println();}@Overridepublic void update(Observable o, Object arg) {System.out.println("mediator对colleague的信息进行仲裁");System.out.println("name:"+super.getInfo().getName());System.out.println("age:"+super.getInfo().getAge());System.out.println("sex:"+(super.getInfo().getSex()?"男":"女"));Student student = (Student) o;System.out.println(super.getInfo().getName() + "老师已经知道"+ student.getInfo().getName() + "说的" + arg);System.out.println(student.getInfo().getName()+"说的"+arg);}@Overridepublic void setFocus(Observable observable) {Student student = (Student) observable;System.out.println("mediator向colleague通信");student.answer();}}
package mediator.impl;import java.util.Observable;import colleague.abs.Student;
import domain.Info;
import mediator.abs.Teacher;public class Teacher2 extends Teacher{public Teacher2(Info info) {super(info);System.out.println("Teacher2");System.out.println(info.getName()+":");System.out.println("生成老师");System.out.println("创建中介者");System.out.println();}@Overridepublic void update(Observable o, Object arg) {System.out.println("Teacher2");System.out.println("mediator对colleague的信息进行仲裁");System.out.println("name:"+super.getInfo().getName());System.out.println("age:"+super.getInfo().getAge());System.out.println("sex:"+(super.getInfo().getSex()?"男":"女"));Student student = (Student) o;System.out.println(super.getInfo().getName() + "老师已经知道"+ student.getInfo().getName() + "说的" + arg);System.out.println(student.getInfo().getName()+"说的"+arg);}@Overridepublic void setFocus(Observable observable) {System.out.println("Teacher2");Student student = (Student) observable;System.out.println("mediator向colleague通信");student.answer();}}

3.6 具体的被中介者

package colleague.impl;import java.util.Observer;import mediator.abs.Teacher;
import colleague.abs.Student;
import domain.Info;public class Student1 extends Student{public Student1(Info info) {super(info);}@Overridepublic void addTeacher(Observer teacher) {super.addObserver(teacher);System.out.println("colleague增加自己的mediator");System.out.println(super.getInfo().getName()+":");System.out.println(super.getInfo().getName()+"设置自己的老师");}@Overridepublic void inform(String msg) {System.out.println("colleague发信信息给mediator");super.setChanged();System.out.println(super.getInfo().getName()+":");System.out.println(super.getInfo().getAge());System.out.println("学生"+super.getInfo().getName()+"报告老师msg:"+msg);super.notifyObservers(msg);}@Overridepublic void delTeacher(Observer observer) {Teacher teacher = (Teacher) observer;System.out.println("colleague不在设置自己的mediator");super.deleteObserver(teacher);System.out.println(super.getInfo().getName()+":");System.out.println(super.getInfo().getSex()?"男":"女");System.out.println(super.getInfo().getName() + "学生从"+ teacher.getInfo().getName() + "老师这里毕业");}@Overridepublic void answer() {System.out.println("collergue对mediator的消息进行响应");System.out.println(super.getInfo().getName()+":");System.out.println("name="+super.getInfo().getName());System.out.println("age="+super.getInfo().getAge());System.out.println("sex="+(super.getInfo().getSex()?"男":"女"));}}
package colleague.impl;import java.util.Observer;import mediator.abs.Teacher;
import colleague.abs.Student;
import domain.Info;public class Student2 extends Student{public Student2(Info info) {super(info);}@Overridepublic void addTeacher(Observer teacher) {System.out.println("Student2");super.addObserver(teacher);System.out.println("colleague增加自己的mediator");System.out.println(super.getInfo().getName()+":");System.out.println(super.getInfo().getName()+"设置自己的老师");}@Overridepublic void inform(String msg) {System.out.println("Student2");System.out.println("colleague发信信息给mediator");super.setChanged();System.out.println(super.getInfo().getName()+":");System.out.println(super.getInfo().getAge());System.out.println("学生"+super.getInfo().getName()+"报告老师msg:"+msg);super.notifyObservers(msg);}@Overridepublic void delTeacher(Observer observer) {Teacher teacher = (Teacher) observer;System.out.println("Student2");System.out.println("colleague不在设置自己的mediator");super.deleteObserver(teacher);System.out.println(super.getInfo().getName()+":");System.out.println(super.getInfo().getSex()?"男":"女");System.out.println(super.getInfo().getName() + "学生从"+ teacher.getInfo().getName() + "老师这里毕业");    }@Overridepublic void answer() {System.out.println("Student2");System.out.println("collergue对mediator的消息进行响应");System.out.println(super.getInfo().getName()+":");System.out.println("name="+super.getInfo().getName());System.out.println("age="+super.getInfo().getAge());System.out.println("sex="+(super.getInfo().getSex()?"男":"女"));System.out.println(getInfo().getName()+"是最"+(getInfo().getSex()?"帅":"漂亮")+"的");}}

3.7 调用者

package client;import mediator.impl.Teacher1;
import mediator.impl.Teacher2;
import colleague.impl.Student1;
import colleague.impl.Student2;
import domain.Info;public class Main {public static void main(String[] args) {//生成老师,同学Student1 student1 = new Student1(new Info("赵小明", 16, Boolean.TRUE));Teacher1 teacher1 = new Teacher1(new Info("王老师", 36, Boolean.FALSE));//学生找到自己的老师student1.addTeacher(teacher1);//学生请求老师(问问题)student1.inform("老师好");//老师提问学生teacher1.setFocus(student1);System.out.println();System.out.println("另一个学生");System.out.println();//增加另一个学生Student1 student12 = new Student1(new Info("李敏", 18, Boolean.FALSE));student12.addTeacher(teacher1);student12.inform("老师很漂亮");teacher1.setFocus(student12);System.out.println();System.out.println("另一种学生");System.out.println();//增加另一种学生Student2 student2 = new Student2(new Info("好学生", 17, Boolean.TRUE));student2.addTeacher(teacher1);student2.inform("老师讲的很明白");teacher1.setFocus(student2);//删除老师student1.delTeacher(teacher1);System.out.println();System.out.println("增加另一种老师");System.out.println();//增加另一种老师Teacher2 teacher2 = new Teacher2(new Info("美女老师", 33, Boolean.FALSE));student1.addTeacher(teacher2);student12.addTeacher(teacher2);student2.addTeacher(teacher2);student1.inform("美女老师:"+student1.getInfo().getName());student12.inform("漂亮老师:"+student12.getInfo().getName());student2.inform("女神老师:"+student2.getInfo().getName());teacher2.setFocus(student1);teacher2.setFocus(student12);teacher2.setFocus(student2);student1.delTeacher(teacher1);student1.delTeacher(teacher2);student12.delTeacher(teacher1);student12.delTeacher(teacher2);student2.delTeacher(teacher1);student2.delTeacher(teacher2);}}

3.8 结果

王老师:
生成老师
创建中介者colleague增加自己的mediator
赵小明:
赵小明设置自己的老师
colleague发信信息给mediator
赵小明:
16
学生赵小明报告老师msg:老师好
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道赵小明说的老师好
赵小明说的老师好
mediator向colleague通信
collergue对mediator的消息进行响应
赵小明:
name=赵小明
age=16
sex=男另一个学生colleague增加自己的mediator
李敏:
李敏设置自己的老师
colleague发信信息给mediator
李敏:
18
学生李敏报告老师msg:老师很漂亮
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道李敏说的老师很漂亮
李敏说的老师很漂亮
mediator向colleague通信
collergue对mediator的消息进行响应
李敏:
name=李敏
age=18
sex=女另一种学生Student2
colleague增加自己的mediator
好学生:
好学生设置自己的老师
Student2
colleague发信信息给mediator
好学生:
17
学生好学生报告老师msg:老师讲的很明白
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道好学生说的老师讲的很明白
好学生说的老师讲的很明白
mediator向colleague通信
Student2
collergue对mediator的消息进行响应
好学生:
name=好学生
age=17
sex=男
好学生是最帅的
colleague不在设置自己的mediator
赵小明:
男
赵小明学生从王老师老师这里毕业增加另一种老师Teacher2
美女老师:
生成老师
创建中介者colleague增加自己的mediator
赵小明:
赵小明设置自己的老师
colleague增加自己的mediator
李敏:
李敏设置自己的老师
Student2
colleague增加自己的mediator
好学生:
好学生设置自己的老师
colleague发信信息给mediator
赵小明:
16
学生赵小明报告老师msg:美女老师:赵小明
Teacher2
mediator对colleague的信息进行仲裁
name:美女老师
age:33
sex:女
美女老师老师已经知道赵小明说的美女老师:赵小明
赵小明说的美女老师:赵小明
colleague发信信息给mediator
李敏:
18
学生李敏报告老师msg:漂亮老师:李敏
Teacher2
mediator对colleague的信息进行仲裁
name:美女老师
age:33
sex:女
美女老师老师已经知道李敏说的漂亮老师:李敏
李敏说的漂亮老师:李敏
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道李敏说的漂亮老师:李敏
李敏说的漂亮老师:李敏
Student2
colleague发信信息给mediator
好学生:
17
学生好学生报告老师msg:女神老师:好学生
Teacher2
mediator对colleague的信息进行仲裁
name:美女老师
age:33
sex:女
美女老师老师已经知道好学生说的女神老师:好学生
好学生说的女神老师:好学生
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道好学生说的女神老师:好学生
好学生说的女神老师:好学生
Teacher2
mediator向colleague通信
collergue对mediator的消息进行响应
赵小明:
name=赵小明
age=16
sex=男
Teacher2
mediator向colleague通信
collergue对mediator的消息进行响应
李敏:
name=李敏
age=18
sex=女
Teacher2
mediator向colleague通信
Student2
collergue对mediator的消息进行响应
好学生:
name=好学生
age=17
sex=男
好学生是最帅的
colleague不在设置自己的mediator
赵小明:
男
赵小明学生从王老师老师这里毕业
colleague不在设置自己的mediator
赵小明:
男
赵小明学生从美女老师老师这里毕业
colleague不在设置自己的mediator
李敏:
女
李敏学生从王老师老师这里毕业
colleague不在设置自己的mediator
李敏:
女
李敏学生从美女老师老师这里毕业
Student2
colleague不在设置自己的mediator
好学生:
男
好学生学生从王老师老师这里毕业
Student2
colleague不在设置自己的mediator
好学生:
男
好学生学生从美女老师老师这里毕业

4.总结

本来中介者和被中介者之间是强关联,但是使用了观察者模式后,强关联变成弱关联。

对于单独的中介者来说,随着功能的扩充,中介者会越来越庞大。
但是经过与观察者模式结合后,中介者和被中介者处于同一等级上:
中介者庞大了可以在新开一个中介者
被中介者庞大了可以在新开一个被中介者

解决了单独的中介者模式的一个弊端。。。。
23种设计模式

23种设计模式----中介者模式----行为型模式相关推荐

  1. C++23种设计模式(1)-工厂方法模式

    C++常用的设计模式有23种. 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享 ...

  2. 23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式。

    23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式. 1. 随处可见的模板模式 2. 暗含讲究的工厂方法模式 3. 单例模式隐含的坑你能看到第几层? 视频讲解如下,点击观看: [干货篇]23种 ...

  3. 23种设计模式(十四)模板方法模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  4. 23种设计模式(二十三)访问者模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  5. 23种设计模式【全】 包含:模式定义 使用场景 实现步骤 优缺点 模式区别 UML类图 示例代码 注意项等

    23种设计模式(全) ***项目地址***:[GitHub](https://github.com/yjhroot/design-pattern) 声明 模式分类(3大类) 创建型模式(共5种) 结构 ...

  6. 23种设计模式分析(7):行为型模式

    1.1.21 Strategy策略模式 Strategy(策略)模式又称Policy模式.GOF<设计模式>一书对Strategy模式是这样描述的: 定义一系列的算法,把他们一个个封装起来 ...

  7. 23种设计模式(6):代理模式

    先看一个例子,是有关于打游戏杀怪兽的. //先定义一个游戏者接口 public interface IGamePlayer {//登陆游戏public void login(String user, ...

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

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

  9. 23种设计模式(7):原型模式

    本文主要介绍设计模式中的原型模式. 现在电子账单越来越流行了,比如你的信用卡,到月初的时候银行就会发一份电子邮件到你邮箱中,说你这个月消费了多少,什么时候消费的,积分是多少等等,这是每个月发一次,还有 ...

最新文章

  1. Spring源码分析【2】-Tomcat和Sping的连接点
  2. 【Linux】类Unix 操作系统进程监控控制工具 Supervisor
  3. 把集成测试和单元测试写一起是一种什么体验?
  4. php依次替换文本字符串中的图片src地址
  5. mybatis处理集合、循环、数组和in等语句的使用
  6. Django REST框架 -1
  7. Canalys:尽管面临供应压力 2021年智能手机的出货量仍预计增长12%
  8. Memcahce和Redis比较
  9. 为什么要追求“极简”代码?
  10. Axure RP原型
  11. 从日企和水浒传看企业如何转型
  12. 笔记本电脑计计算机硬盘分区,笔记本电脑如何分区,手把手教你笔记本电脑如何分盘...
  13. 快手科技更新招股书:前11个月营收525亿元,引入10家基石投资者
  14. 理不懂,你注定就是穷打工的命 【转】
  15. 贴片电解电容47UF16V 6.3*4.5
  16. JEECG3.8 全套实战视频全部开放,免费下载!
  17. ANO匿名飞控STM32代码解读(二)数据传输——Ano_DT.c
  18. 钉钉第三方企业应用开发快速入门
  19. 数据结构与算法——中缀表达式转后缀表达式
  20. 什么是IP Core?

热门文章

  1. Elasticsearch的架构
  2. 华为mate20保时捷鸿蒙,抢到就是赚!华为Mate20RS保时捷设计明日开售
  3. Java--百钱百鸡(经典算法)
  4. egret判断两个多边形是否相交(分离轴定律)
  5. 小程序毕设作品之微信校园二手书交易小程序毕业设计成品(7)中期检查报告
  6. CSDN第一篇日记 2019年5月18日
  7. 【webrtc】 socket 运行机制以及 stun 收发过程
  8. [USACO 1.5] 跳棋的挑战
  9. 【css】4.background-image背景图片设置
  10. Go 语言优秀资源整理,为项目落地加速