中介者模式从名字来看不难理解,就是给A和B提供一个中间人,扩展开来说就是如果系统中多个系统交互,如果他们各自为战,自己负责和其他所有对象进行交互,最后会形成一张很复杂的交互网,而中介者模式就是来使这张网变得简单,所有对象不用和其他对象一一交互,全都和中介者这个角色交互。从而形成一个简单的星型结构。
中介者模式引入了中介者角色。
中介者模式和外观模式的区分:中介者模式引入了一个中介者代替对象之间复杂的相互交互,外观模式引入了外观角色来和客户端进行交互。两者的区别是什么呢?如果说从外观模式中的外观角色那里划一条线,客户端在外观角色的左边,那么复杂的中介者模式就在客户端的右边,示意图如下:
中介者模式UML类图:
中介者和同事类相互持有引用
示例代码:
抽象中介者:
/*****
* 抽象中介者类
* @author wjw
*
*/
public abstract class Mediator {
protected List<Colleague> colleagues = new ArrayList<Colleague>();
/***
* 向中介者中注册同事成员方法
*/
public void register(Colleague c){
colleagues.add(c);
}
public abstract void method();
}
具体中介者:
/****
* 具体中介者
* @author wjw
*
*/
public class ChangeMediator extends Mediator{
@Override
public void method() {
// TODO Auto-generated method stub
Iterator iterator = colleagues.iterator();
while(iterator.hasNext()){
Colleague colleague = (Colleague)iterator.next();
colleague.change();
}
}
}
抽象同事类:
/*****
* 抽象同事类
*
* @author wjw
*
*/
public abstract class Colleague {
protected Mediator mediator;
protected int num;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
public int getNum() {
return num;
}
/****
* 与中介者进行通信
*/
public void add(){
mediator.method();
}
public abstract void change();
}
具体同事类 A B C:
public class AColleague extends Colleague {
public AColleague(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
num = (int)'a';
}
@Override
public void change() {
// TODO Auto-generated method stub
num++;
}
}
public class BColleague extends Colleague {
public BColleague(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
num = (int)'b';
}
@Override
public void change() {
// TODO Auto-generated method stub
num++;
}
}
public class CColleague extends Colleague {
public CColleague(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
num = (int)'c';
}
@Override
public void change() {
// TODO Auto-generated method stub
num++;
}
}
public class Main {
public static void main(String[] args) {
//new中介者对象
Mediator mediator = new ChangeMediator();
//new 3个同事对象,建立所有同事对象和终结者对象的关联
Colleague a,b,c;
a = new AColleague(mediator);
b = new BColleague(mediator);
c = new CColleague(mediator);
//向中介者对象中添加同事对象,用于A和BC两个同事通信
mediator.register(b);
mediator.register(c);
//查看初始数据(初始数据为abc三个小写字母ascII码)
System.out.println("A:" + a.getNum() + " B:" + b.getNum() + " C:" + c.getNum());
a.add();
System.out.println("A:" + a.getNum() + " B:" + b.getNum() + " C:" + c.getNum());
}
}
运行结果:
A:97 B:98 C:99
A:97 B:99 C:100
示例程序说明:
该程序演示的是ABC三个同事类一个调用add方法(自身num值不受影响)即影响到其他两个类num值,这里要探讨一下中介者模式的好处,如果不使用中介者模式会怎样,ABC三个类每个类都要保持另外两个类的引用,这样就形成了复杂的网状结构,类与类之间的耦合性太强了。
而使用中介者类呢,ABC三个类只需与中介者类发生关系,类和类只间的耦合性大大降低,十分有利于程序扩展。
在Main方法中,我们将所有类的引用注册到中介者中,中介者依靠这些引用才能与这些对象交互,不注册不参与交互。同时每一个同事类维持一个对中介者的引用,这自然也是为了类与类之间的交互。
通过以上,可知:
中介者模式就是将原来对象与对象之间交互形成的复杂网状结构解耦成为简单的星型结构,这个星型结构的核心就是中介者角色。
如有错误,欢迎指正
end