1、定義
中介者模式(Mediator),用一個中介對象來封裝一系列的對象交互。中介者使各個對象不需要顯式地相互引用,從而使耦合松散,而且可以獨立的改變他們之間的交互。
2、UML
各個類說明:
Mediator:抽象終結者,定義了同事對象到終結者對象的接口
Colleague:抽象同事類
ConcreteMediator:具體中介者對象,實現抽象類的方法,它需要知道所有具體同事類,並從具體同事接收消息,向具體同事對象發出命令。
ConcreteColleague:具體同事類,每個具體同事只知道自己的行為,而不了解其他同事類的情況,但他們卻都認識中介者對象。
3、優點:
減少了各個Colleague的耦合,使得可以獨立地改變和復用各個Colleague類和Mediator
由於把對象如何寫作進行了抽象,將終結作為一個獨立的概念並將其封裝在一個對象中,這樣關注的對象就從對象各自本身的行為轉移到了他們之間的交互上來到了,也就是站在一個更宏觀的角度去看待系統。
4、缺點:
由於ConcreteMediator控制了集中化,於是就把交互復雜性變為了中介者的復雜性,這就使得中介者會變得比任何一個ConcreteMediator都復雜
5、適合應用場景:
中介者模式一般應用於一組對象以定義良好,但是復雜的方式進行通信的場合,比如窗體Form對象或Web頁面aspx,以及想定制一個分部在多個類中的行為,而又不想生成太多的子類的場合。
6、例子:
寫個例子練練手
package com.zcr.Mediator;
//抽象同事類
public abstract class Colleague
{
protected Mediator mediator;
//構造方法,得到中介者對象
public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
}
package com.zcr.Mediator;
public class ConcreteColleague1 extends Colleague
{
public ConcreteColleague1(Mediator mediator)
{
super(mediator);
}
public void Send(String message)
{
mediator.Send(message, this);
}
public void Notify(String message)
{
System.out.println("同事1得到消息:"+message);
}
}
package com.zcr.Mediator;
public class ConcreteColleague2 extends Colleague
{
public ConcreteColleague2(Mediator mediator)
{
super(mediator);
// TODO Auto-generated constructor stub
}
public void Send(String message)
{
mediator.Send(message, this);
}
public void Notify(String message)
{
System.out.println("同事2得到消息:"+message);
}
}
package com.zcr.Mediator;
public class ConcreteMediator extends Mediator
{
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;
public ConcreteColleague1 getColleague1()
{
return colleague1;
}
public void setColleague1(ConcreteColleague1 colleague1)
{
this.colleague1 = colleague1;
}
public ConcreteColleague2 getColleague2()
{
return colleague2;
}
public void setColleague2(ConcreteColleague2 colleague2)
{
this.colleague2 = colleague2;
}
@Override
public void Send(String message, Colleague colleague)
{
if(colleague == colleague1)
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
}
package com.zcr.Mediator;
//抽象中介者類
public abstract class Mediator
{
//定義一個抽象的發送消息的方法,得到同時對象和發送消息
public abstract void Send(String message,Colleague colleague);
}
package com.zcr.Mediator;
public class MediatorTest
{
public static void main(String[] args)
{
ConcreteMediator m = new ConcreteMediator();
//讓兩個具體同時類認識中介者對象
ConcreteColleague1 c1 = new ConcreteColleague1(m);
ConcreteColleague2 c2 = new ConcreteColleague2(m);
//讓中介者認識各個具體同時類對象
m.setColleague1(c1);
m.setColleague2(c2);
//具體同時類對象的發送信息都是通過中介者發送的
c1.Send("吃過飯了嗎?");
c2.Send("沒有呢,打算請客?");
}
}
運行結果:
因為是初學者,例子比較簡單,忘見諒。