中介者模式 调停者 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);
} @Override
void 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();
}
}

小结
中介者模式时序图

与门面模式对比

扩展
总结

中介者模式 调停者 Mediator 行为型 设计模式(二十一)的更多相关文章
- 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy 与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- 设计模式——中介者模式/调停者模式(C++实现)
#include <iostream> #include <string> using namespace std; class Colleague; class Mediat ...
- 设计模式 ( 二十一 ):Vistor访问者模式 -- 行为型
1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有 ...
- 1、迭代器 Iterator模式 一个一个遍历 行为型设计模式
1.Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容. I ...
- GoLang设计模式10 - 中介者模式
中介者模式是一种行为型设计模式.在中介者模式中创建了一个中介对象来负责不同类间的通信.因为这些类不需要直接交互,所以也就能避免它们之间的直接依赖,实现解耦的效果. 中介者模式的一个典型案例是老式小火车 ...
- 深入浅出设计模式——中介者模式(Mediator Pattern)
模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...
- 设计模式之中介者模式(Mediator )
中介者模式是关于数据交互的设计模式,该模式的核心是一个中介者对象,负责协调一系列对象之间的不同的数据请求,这一系列对象成为同事类.如房产中介(简直不想提它),买房的卖房的,租房的放租的都到房产中介那里 ...
- 17中介者模式Mediator
一.什么是中介者模式 Mediator模式也叫中介者模式,是由GoF提出的23种 软件设计模式的一种.Mediator模式是行为模式之一, 在Mediator模式中,类之间的交互行为被统一放在 Med ...
随机推荐
- 在ASP.NET Core中给上传图片功能添加水印
在传统的.NET框架中,我们给图片添加水印有的是通过HttpModules或者是HttpHandler,然后可以通过以下代码添加水印: var image = new WebImage(imageBy ...
- jdk源码阅读笔记-HashMap
文章出处:[noblogs-it技术博客网站]的博客:jdk1.8源码分析 在Java语言中使用的最多的数据结构大概右两种,第一种是数组,比如Array,ArrayList,第二种链表,比如Array ...
- Spring Boot 入门教程 | 图文讲解
目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...
- 处女作《Web全栈开发进阶之路》出版了!
书中源码下载地址:https://github.com/qinggee/WebAdvanced 01. 当初决定写博客的原因非常的纯洁:只要每个月写上 4 篇以上博客,月底的绩效奖金就多 500 块. ...
- SpringBoot之旅第一篇-初探
一.SpringBoot是什么? 微服务,应该是近年来最火的概念,越来越多的公司开始使用微服务架构,面试中被问到的微服务的概率很高,不管对技术的追求,还是为了进更好的公司,微服务都是我们开发人员的必须 ...
- vue客户端渲染首屏优化之道
提取第三方库,缓存,减少打包体积 1. dll动态链接库, 使用DllPlugin DllReferencePlugin,将第三方库提取出来另外打包出来,然后动态引入html.可以提高打包速度和缓存第 ...
- 我的秋招经验分享(已拿BAT头条网易滴滴)
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- Oracle数据库常用SQL函数
1.SQL函数的概念: 函数一般是在数据上执行的,它给数据的转换和处理提供了方便.只是将取出的数据进行处理,不会改变数据库中的值.(类似于java中的方法但函数只是将数据库中的数据取出(复制)到函数中 ...
- Properties类对于文件的读取和写入
Properties类表示一个持久的属性集.Properties可保存在流中或从流中加载.Properties对象只能加载以 .Properties 为后缀的文件(文件我创建在src下). 开始时文件 ...
- html学习之路--简单图片轮播
一个简单的图片轮播效果 photo.html页面代码,基本的HTML结构,在main中显示图片,此处图片依次命名为1.jpg.2.jpg.3.jpg.4.jpg. <!DOCTYPE html& ...