设计模式——中介者模式
程序员文章站
2024-03-23 08:26:58
...
作者:云都小生
概述
在学习这个模式之前,我们先来回顾一下一个面向对象的设计原则——迪米特原则,这个原则告诉我们:一个对象尽可能少跟其他对象进行关联,就像一个人要少跟陌生人说话一样。
而中介者模式,也正是为了协调多个对象之间复杂的引用关系。我们来看一个例子,虽然这个例子不太好,后期想个好一点的例子再改。
中介者模式角色
在中介者模式中,主要是引入了中介者角色,分别是抽象中介者和具体中介者,封装了各个对象之间共同的交互方法。
抽象同事类:定义了各个同事类共有的方法,它维持着一个抽象中介者类的引用。
具体同事类:它是抽象同事类的子类,每一个同事对象都需要通过中介者与其他同事类进行通信。
你会发现,这样我们就重新构造出了一张关系网:
这样就对同事对象之间的关系行为进行了分离和封装。
代码案例
在面向组件开发时,我们经常会使用到一些按钮、下拉菜单、标签等控件。问题来了,如果我们希望按钮一按下,下拉菜单就进行改变,或者希望按钮单击后,标签内容就进行改变··· 这就意味着,各个控件之间需要有一个关联的关系。
一般人设计后的关系图是这样···
而正确的设计是····
//抽象中介者
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标签,当鼠标单击的时候就进行怎样的交互。我们可以增加一个新的中介者,又或者是在原来的中介者基础上进行扩展。
总结
中介者模式的核心在于,对多个对象之间的交互进行了解耦。缺点相信大家都看到了,如果按照上面去设计,得主动去设定各个控件之前的关系,代码很冗长。而且,具体中介者包含了大量交互的细节,使中介者变得难以维护。
推荐阅读
-
行为型模式之中介者模式
-
设计模式——中介者模式
-
设计模式---中介者模式
-
支付过程中的设计模式-状态模式(一)
-
基于MVC设计模式实战ExtJS4.2高级组件+SSH2在线投稿系统
-
JBoss内置的HSQL DB数据库 JBossHSQLDBSQL Server设计模式JDBC
-
Struts2中的设计模式 -ThreadLocal模式 设计模式strutsthread多线程java
-
Struts2中的设计模式 -ThreadLocal模式 设计模式strutsthread多线程java
-
来自Jeff Dean的分布式系统设计模式(更新版) 设计模式应用服务器SilverlightMapreduceGoogle
-
0.开篇-设计模式学习之坦克大战