中介者模式 调停者 Mediator 行为型 设计模式(二十一)
意图
结构
class A{ void f(){ //do sth B b = new B(); b.g(); }
class Mediator{ A a = new A(); B b = new B(); void cooperation(){ a.f(); b.g(); } }
代码示例
- 预览区域内的字体将会发生变化
- 右下角的Apply 应用按钮将成为可点击状态
package mediator.simple;/** * 设置字体类,提供字体设置方法. * 并且创建展示Display对象,调用reDisplay方法重新展示 * 并且创建按钮Button对象,调用applyButton方法使能应用按钮 */ public class Font {public void setFont() {System.out.println("设置字体...");Display display = new Display();display.reDisplay();Button button = new Button();button.applyButton();} }
package mediator.simple;public class Display {public void reDisplay() {System.out.println("字体重新展示...");} }
package mediator.simple;public class Button {public void applyButton() {System.out.println("应用按钮可用...");} }
package mediator.simple; public class Test {public static void main(String[] args) {Font font = new Font();font.setFont();} }
重构中介者模式
- 通过引入mediator中介者,作为同事之间协作的中间人,提供operation()方法,用于同事间请求协助、事件处理
- 每个同事类都知道这个中介,所以在抽象角色Colleague中设置了Mediator属性,构造方法注入,并且提供notifyEvent方法,封装了mediator的operation()方法
- 当具体的同事ConcreteColleague,执行操作后,需要其他同事协作时,直接调用notifyEvent()方法
- 每个具体的同事提供自身的职责接口
package mediator; public abstract class Mediator { abstract void operation(Colleague event); }
package mediator; public abstract class Colleague { private Mediator mediator;Colleague(Mediator mediator) {this.mediator = mediator;}public void notifyEvent() {mediator.operation(this);} }
package mediator; public class Button extends Colleague {Button(Mediator mediator){super(mediator);}public void applyButton() {System.out.println("应用按钮可用...");} }
package mediator;public class Display extends Colleague {Display(Mediator mediator) {super(mediator);}public void reDisplay() {System.out.println("字体重新展示...");} }
package mediator;public class Font extends Colleague { private String fontName;public String getFontName() {return fontName;}Font(Mediator mediator) {super(mediator);}public void changeFont() {System.out.println("设置字体......");fontName = "微软雅黑";notifyEvent();} }
package mediator; public class ConcreteMediator extends Mediator {private Button button;private Display display;private Font font;ConcreteMediator() {button = new Button(this);display = new Display(this);font = new Font(this);}@Overridevoid operation(Colleague event) {if (event instanceof Font) {setFontEvent(event);}}private void setFontEvent(Colleague event) {System.out.println(((Font) event).getFontName());button.applyButton();display.reDisplay();} }
package mediator;public class Test {public static void main(String[] args){Mediator mediator = new ConcreteMediator();Font font = new Font(mediator);font.changeFont();} }
小结
中介者模式时序图
与门面模式对比
扩展
总结
转载于:https://www.cnblogs.com/noteless/p/10130616.html
中介者模式 调停者 Mediator 行为型 设计模式(二十一)相关推荐
- 设计模式(十一)中介者模式(调停者模式)
1. 中介者模式定义 定义:用一个中介者对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互. 中介者模式结构图如下图所示. 在中介者模 ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- java计数器策略模式_java设计模式(二十一)--策略模式
对于策略模式,我在很多面试题上看到过考察这一类的问题,这种模式也的确比较好用. 我感觉这种模式就是将不同实现的方法放到一个接口中,然后通过实现这个接口来实现不同的运行结果,这种模式有三部分构成: 策略 ...
- 设计模式-行为型模式:中介者模式
目录 1.简介 2.组成部分 3.优缺点 4.使用场景 5.代码实现 1.简介 中介者模式(Mediator Pattern)是一种行为型设计模式,它通过将对象间的交互行为集中到一个中介对象中,来降低 ...
- php中介模式,中介者模式(Mediator pattern)详解及PHP实现
中介者模式是一种行为型模式,它包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散偶合.当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可 ...
- 14.设计模式--中介者模式(Mediator模式)
1.定义 中介者模式是一种行为型模式,是为了解决对象之间错综复杂的调用关系的一种设计模式,这种错综复杂的调用关系采用一个中介类来进行帮忙调用,所有的调用者只是需要关心中介者,而不需要进行互相依赖. 例 ...
- Android设计模式(十六)-中介者模式
原文地址 http://blog.csdn.net/qq_25806863/article/details/69396448 中介者模式又叫调解者模式或调停者模式,是行为型设计模式之一. 生活中的中介 ...
- 设计模式(十四)中介者模式
相关文章 设计模式(一)设计六大原则 设计模式(二)单例模式的七种写法 设计模式(三)建造者模式 设计模式(四)简单工厂模式 设计模式(五)观察者模式 设计模式(六)代理模式 设计模式(七)装饰模式 ...
- Python设计模式-中介者模式
Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...
最新文章
- nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping
- python day two,while
- pgpool-II的性能缺陷(二)
- Ubuntu16.04 配置pytorch
- python有趣的小项目-这10个Python项目超有趣!
- VB 宏+mysql解决EXCEL表格实现自动化处理
- 【手写】每个人心中都住着一座城。。。
- python的68个内置函数
- Spring Clould负载均衡重要组件:Ribbon中重要类的用法
- .Net(C#)用正则表达式清除HTML标签(包括script和style),保留纯本文(UEdit中编写的内容上传到数据库)...
- MR/hive/shark/sparkSQL
- [2007最后一博]Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件...
- linux 调用外部变量,sed当中使用变量替换以及执行外部命令
- 计算机考试演示文稿模板,2018职称计算机考试PowerPoint习题10
- 【Java】OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes…… 的解决方法
- 面试被问线程池,真香
- vs2010跟vs2008比较增加了哪些功能
- 得到的概率值_手把手教你将矩阵概率画成图
- 前嗅ForeSpider教程:采集新浪新闻
- 从0到1搭建大数据平台之数据采集篇
热门文章
- c语言统计最长单词长度,求3个字符串中最长单词的长度 求救 会一个的
- java ase 加密_java实现ase加密解密
- yolo如何降低loss_从未看过如此通俗易懂的YOLO系列
- 开源Vue表格组件,表格插件源码
- [flite源码分析一]常用数据结构cst_val
- LeetCode 1114. Print in Order--Java解法--并发问题
- 华为鸿蒙概念机990,华为5G概念新机:鸿蒙OS系统+麒麟990+石墨烯 安卓机皇来势汹汹...
- ubuntu20安装mysql8.0.28
- 【每日一题】 面试题 17.14. 最小K个数
- Mybatis 3.5.X 解析LocalDateTime 错误问题