设计模式——中介者模式
2018-02-23 23:16
148 查看
作者:云都小生
推荐资料:史上最全设计模式导学目录(完整版)概述
在学习这个模式之前,我们先来回顾一下一个面向对象的设计原则——迪米特原则,这个原则告诉我们:一个对象尽可能少跟其他对象进行关联,就像一个人要少跟陌生人说话一样。而中介者模式,也正是为了协调多个对象之间复杂的引用关系。我们来看一个例子,虽然这个例子不太好,后期想个好一点的例子再改。
中介者模式角色
在中介者模式中,主要是引入了中介者角色,分别是抽象中介者和具体中介者,封装了各个对象之间共同的交互方法。抽象同事类:定义了各个同事类共有的方法,它维持着一个抽象中介者类的引用。
具体同事类:它是抽象同事类的子类,每一个同事对象都需要通过中介者与其他同事类进行通信。
你会发现,这样我们就重新构造出了一张关系网:
这样就对同事对象之间的关系行为进行了分离和封装。
代码案例
在面向组件开发时,我们经常会使用到一些按钮、下拉菜单、标签等控件。问题来了,如果我们希望按钮一按下,下拉菜单就进行改变,或者希望按钮单击后,标签内容就进行改变··· 这就意味着,各个控件之间需要有一个关联的关系。一般人设计后的关系图是这样···
而正确的设计是····
//抽象中介者 abstract class Mediator { public abstract void componentChanged(Control c); } //具体中介者 public class ConcreteMediator extends Mediator{ public Button button; public List list; public Image image; //封装同事对象之间的交互 public void componentChanged(Control c) { //单击按钮 if(c == button) { System.out.println("--单击增加按钮--"); list.update(); image.update(); } //从列表框选择客户 else if(c == image) { System.out.println("--单击了图片--"); button.update(); list.update(); } //从组合框选择客户 else if(c == list) { System.out.println("--从组合框选择客户--"); image.update(); button.update(); } } } //抽象同事类 abstract class Control { protected Mediator mediator; public void SetMediator(Mediator mediator) { this.mediator = mediator; } public void Changed() { mediator.componentChanged(this); } public abstract void update(); public abstract void select(); } //具体同事类:按钮 public class Button extends Control{ public void update() { System.out.println("按钮进行了更新!"); } public void select() { System.out.println("按钮被选中!"); } } //具体同事类:列表 public class List extends Control{ public void update() { System.out.println("列表框进行了更新!"); } public void select() { System.out.println("列表框被选中!"); } } //具体同事类:图片 public class Image extends Control{ public void update() { System.out.println("图片进行了更新!"); } public void select() { System.out.println("图片被选中!"); } } public class Test { public static void main(String[] args) { ConcreteMediator mediator; mediator = new ConcreteMediator(); //定义同事对象 Button button = new Button(); List list = new List(); Image image = new Image(); button.SetMediator(mediator); list.SetMediator(mediator); image.SetMediator(mediator); mediator.button = button; mediator.list = list; mediator.image = image; button.Changed(); System.out.println("-----------------------------"); image.Changed(); } }
这样一设计,我们就对各个同事类之间的交互进行了解耦。而且,如果我们相加一个Lable标签,当鼠标单击的时候就进行怎样的交互。我们可以增加一个新的中介者,又或者是在原来的中介者基础上进行扩展。
总结
中介者模式的核心在于,对多个对象之间的交互进行了解耦。缺点相信大家都看到了,如果按照上面去设计,得主动去设定各个控件之前的关系,代码很冗长。而且,具体中介者包含了大量交互的细节,使中介者变得难以维护。相关文章推荐
- 设计模式之中介者模式
- C++设计模式之十七:Mediator(中介者模式)
- 设计模式学习总结(23) 中介者模式
- 设计模式开始--中介者模式
- 设计模式之中介者模式
- 【软考学习】设计模式——中介者模式
- 设计模式 状态模式 策略模式 观察者模式 命令模式 中介者模式
- C#设计模式(十四)中介者模式
- Java设计模式——Mediator(中介者)模式
- 设计模式之中介者模式
- 设计模式知识连载(33)---中介者模式:
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
- JAVA设计模式十三--Mediator(中介者模式)
- 设计模式——中介者
- 设计模式-中介者模式
- 设计模式系列5-----C++实现中介者模式(Mediator Pattern)
- 【设计模式】中介者
- 设计模式:25 世界需要和平_中介者模式
- 类对象Java设计模式之十八(中介者模式)
- 设计模式 - 中介者模式