您的位置:首页 > 其它

设计模式——中介者模式

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标签,当鼠标单击的时候就进行怎样的交互。我们可以增加一个新的中介者,又或者是在原来的中介者基础上进行扩展。

总结

中介者模式的核心在于,对多个对象之间的交互进行了解耦。缺点相信大家都看到了,如果按照上面去设计,得主动去设定各个控件之前的关系,代码很冗长。而且,具体中介者包含了大量交互的细节,使中介者变得难以维护。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  中介者模式