Refer to: http://blog.sina.com.cn/s/blog_3fe961ae0100qbz6.html
意圖
通過(guò)引入中介者模式來(lái)在對(duì)象之間傳遞消息(承擔(dān)中介者),以簡(jiǎn)化對(duì)象之間的通信。
什么是中介者模式
中介者模式包裝了一系列對(duì)象相互作用的方式,使得這些對(duì)象不必互相明顯引用。從而使它們可以較松散地耦合。當(dāng)這些對(duì)象中的某些對(duì)象之間的相互作用發(fā)生改變時(shí),不會(huì)立即影響到其他的一些對(duì)象之間的相互作用。從而保證這些相互作用可以彼此獨(dú)立地變化。
在中介者模式中,所有的成員對(duì)象者可以協(xié)調(diào)工作,但是又不直接相互管理。這些對(duì)象都與一個(gè)處于中心地位的中介者對(duì)象發(fā)生緊密的關(guān)系,由這個(gè)中介者對(duì)象進(jìn)行協(xié)調(diào)工作。這個(gè)協(xié)調(diào)者對(duì)象叫做中介者(Mediator),而中介者所協(xié)調(diào)的成員對(duì)象稱(chēng)做同事(Colleague)對(duì)象。
類(lèi)圖
角色
(1)抽象中介者(Mediator)角色:定義出同事對(duì)象到中介者對(duì)象的接口,其中主要的方法是一個(gè)(或者多個(gè))事件方法。在有些情況下,這個(gè)抽象對(duì)象可以省略。
(2)具體中介者(ConcreteMediator)角色:從抽象中介者繼承而來(lái),實(shí)現(xiàn)了抽象超類(lèi)所聲明的事件方法。具體中介者知曉所有的具體同事類(lèi),它從具體同事對(duì)象接收消息、向具體同事對(duì)象發(fā)出命令。
(3)抽象同事類(lèi)(Colleague)角色:定義出中介者到同事對(duì)象的接口。同事對(duì)象只知道中介者而不知道其余的同事對(duì)象。
(4)具體同事類(lèi)(ConcreteColleague)角色:所有的具體同事類(lèi)均從抽象同事類(lèi)繼承而來(lái)。每一個(gè)具體同事類(lèi)都很清楚它自己在小范圍內(nèi)的行為,而不知道它在大范圍內(nèi)的目的。在示意性的類(lèi)圖中,具體同事類(lèi)是Colleague1和Colleague2。
源代碼
package 中介者模式;
//抽象中介者
public abstract class Mediator {
//事件方法,由子類(lèi)實(shí)現(xiàn)
public abstract void colleagueChanged(Colleague c);
}
package 中介者模式;
//抽象同事類(lèi)
public abstract class Colleague {
private Mediator mediator;
//構(gòu)造函數(shù),中介者作為參數(shù)
public Colleague(Mediator m){
this.mediator=m;
}
public Mediator getMediator(){
return this.mediator;
}
//行動(dòng)方法,由子類(lèi)實(shí)現(xiàn)
public abstract void action();
//當(dāng)同事對(duì)象發(fā)生變化時(shí),告知中介者
public void change(){
mediator.colleagueChanged(this);
}
}
package 中介者模式;
public class Colleague1 extends Colleague {
public Colleague1(Mediator m) {
super(m);
}
@Override
public void action() {
System.out.println("Colleague1 action");
}
}
package 中介者模式;
public class Colleague2 extends Colleague {
public Colleague2(Mediator m) {
super(m);
}
@Override
public void action() {
System.out.println("Colleague2 action");
}
}
package 中介者模式;
//具體中介者
public class ConcreteMediator extends Mediator{
private Colleague1 colleague1;
private Colleague2 colleague2;
@Override
public void colleagueChanged(Colleague c) {
//中介者通知其它同事對(duì)象作出響應(yīng),實(shí)際的代碼要復(fù)雜得多
if(c==colleague1){
System.out.println("colleague1發(fā)生改變,其他同事對(duì)象作出響應(yīng)");
this.colleague2.action();
}else if(c==colleague2){
System.out.println("colleague2發(fā)生改變,其他同事對(duì)象作出響應(yīng)");
this.colleague1.action();
}
}
public void createConcreteColleague(){
colleague1=new Colleague1(this);
colleague2=new Colleague2(this);
}
public Colleague1 getColleague1() {
return colleague1;
}
public Colleague2 getColleague2() {
return colleague2;
}
}
package 中介者模式;
public class Client {
public static void main(String[] args) {
ConcreteMediator m = new ConcreteMediator();
m.createConcreteColleague();
Colleague c1=m.getColleague1();
Colleague c2=m.getColleague2();
c1.change();
c2.change();
}
}
輸出:
colleague1發(fā)生改變,其他同事對(duì)象作出響應(yīng)
Colleague2 action
colleague2發(fā)生改變,其他同事對(duì)象作出響應(yīng)
Colleague1 action
-----------------------------------------------------
Silence, the way to avoid many problems;
Smile, the way to solve many problems;