中介者模式 调停者 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 ...
随机推荐
- MIP 与 AMP 合作进展(3月7日)
"到目前为止,全网通过 MIP 校验的网页已超10亿.除了代码和缓存, MIP 还想做更多来改善用户体验移动页面." 3月7日,MIP 项目负责人在首次 AMP CONF 上发言. ...
- Java8新特性之二:方法引用
上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...
- visual studio code .net 开发
Visual Studio确实是相当好用,各种简化操作什么的简直不要太舒服.但其容量太大,有时不是很方便,所以今天简单介绍一下另一个工具--Visual Studio Code. 虽然相比于老大哥Vi ...
- 使用bootstrap table 数据绑定
1.最近一直在用bootstrap table 这个前端框架做项目,下面是使用bootstrap table 的一些总结 这个使用.Net 中MVC做的: 2.这个是基本的boostrap table ...
- Java基础练习2(构造方法)
1.以下关于面向对象概念的描述中,不正确的一项是() A.在构造方法中,this()只能出现在构造方法第一行位置 B.在构造方法中,super()只能出现在构造方法第一行位置 C.this()和sup ...
- idea配置tomcat运行按钮置灰,下拉没有自定义的tomcat选项
一.问题 下拉没有自定义tomcat的选项 run按钮置灰,点不了 二.解决 添加自己的tomcat时,一定要点加号,不要用那个默认的.
- Django学习之十三:提高页面开发效率减少冗余的模板系统
目录 Django 模板 模板语法 逻辑语法 函数式过滤器 内置filter 功能tag 注释 内置tag 导入三方tag and filter(load) 过滤器和功能tag的区别 自定义tag和f ...
- SQLServer之删除数据库架构
删除数据库架构注意事项 要删除的架构不能包含任何对象. 如果架构包含对象,则 DROP 语句将失败. 可以在 sys.schemas 目录视图中查看有关架构的信息. 要求对架构具有 CONTROL 权 ...
- Elasticsearch安装配置
文档地址: https://www.elastic.co/guide/en/elasticsearch/reference/6.5/setup.html 官方页面提供自0.9版本以来的说明文档,由于我 ...
- Win7系统修改hosts无法保存怎么办?
背景 有的时候我们需要修改hosts文件,但是在某些情况下竟提示保存不了.之前有一次IntelliJ IDEA提示我快到期了,于是我到网上找到了一个激活方法,但需要将一个地址放到hosts文件中去,此 ...