中介(Mediator)模式:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
適用性:- 一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解。
- 一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象。
- 想定制一個分布在多個類中的行為,而又不想生成太多的子類。
為何使用Mediator?
??????? 各個對象之間的交互操作非常多;每個對象的行為操作都依賴彼此對方,修改一個對象的行為,同時會涉及到修改很多其他對象的行為,如果使用Mediator模式,可以使各個對象間的耦合松散,只需關心和 Mediator的關系,使多對多的關系變成了一對多的關系,可以降低系統的復雜性,提高可修改擴展性.
結構圖:
一個簡單的例子:
抽象中介類:
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
?