中介(Mediator)模式:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
適用性:
  • 一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解。
  • 一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象。
  • 想定制一個分布在多個類中的行為,而又不想生成太多的子類。

為何使用Mediator?

??????? 各個對象之間的交互操作非常多;每個對象的行為操作都依賴彼此對方,修改一個對象的行為,同時會涉及到修改很多其他對象的行為,如果使用Mediator模式,可以使各個對象間的耦合松散,只需關心和 Mediator的關系,使多對多的關系變成了一對多的關系,可以降低系統的復雜性,提高可修改擴展性.


結構圖:Mediator.bmp
一個簡單的例子:
抽象中介類:

package?Mediator;

public?abstract?class?Mediator{
????
//將一個Colleague注冊到中介類
????public?abstract?void?register(Colleague?c,String?type);
????
//改變Colleague的狀態
????public?abstract?void?change(String?type);
}

具體中介類:

package?Mediator;

public?class?ConcreteMediator?extends?Mediator{
????
????
private?ColleagueA?ca;
????
private?ColleagueB?cb;
????
????
????
public?ConcreteMediator(){}
????
//具體實現方法
????public?void?register(Colleague?c,String?type){
????????
if(type.equals("A"))
????????????ca
=(ColleagueA)c;
????????
else?if(type.equals("B"))
????????????cb
=(ColleagueB)c;???????
????}

????
????
public?void?change(String?type){
????????
if(type.equals("A"))
?????????????cb.action();
????????
else?if(type.equals("B"))
????????????ca.action();
????}

}

抽象同事類:

package?Mediator;

public?abstract?class?Colleague{
????
public?abstract?void?change();
????
public?abstract?void?action();
}

同事A

package?Mediator;

public?class?ColleagueA?extends?Colleague{
????
private?final?String?type="A";
????
private?Mediator?m;
????
public?ColleagueA(Mediator?mediator){
????????m
=mediator;
????????m.register(
this,type);
????}

????
????
public?void?change(){
????????System.out.println(
"A?is?changed");
????????m.change(type);
????}

????
????
public?void?action(){
????????System.out.println(
"A?is?changed?by?mediator");
????}

}

同事B

package?Mediator;

public?class?ColleagueB?extends?Colleague{
????
private?final?String?type="B";
????
private?Mediator?m;
????
public?ColleagueB(Mediator?mediator){
????????m
=mediator;
????????m.register(
this,type);
????}

????
????
public?void?change(){
????????System.out.println(
"B?is?changed");
????????m.change(type);
????}

????
????
public?void?action(){
????????System.out.println(
"B?is?changed?by?mediator");
????}

}

客戶端:

package?Mediator?;
public?class?Client{
????
????
private?static?Mediator?mediator=new?ConcreteMediator();
????
private?static?Colleague?ca=new?ColleagueA(mediator);
????
private?static?Colleague?cb=new?ColleagueB(mediator);
????
public?static?void?main(String[]?args){
????????mediator.change(
"A");
????????mediator.change(
"B");
????}
?
}




參考資料:《設計模式速查手冊》
http://blog.csdn.net/qutr/archive/2006/07/27/987362.aspx
http://www.jdon.com/designpatterns/mediator.htm

?