調(diào)停者模式(Mediator) 屬于對(duì)象的行為模式。
1. 定義
調(diào)停者模式包裝了一系列對(duì)象相互作用的方式,使得這些對(duì)象不必相互明顯作用。從而使他們可以松散偶合。當(dāng)某些對(duì)象之間的作用發(fā)生改變時(shí),不會(huì)立即影響其他的一些對(duì)象之間的作用。保證這些作用可以彼此獨(dú)立的變化。調(diào)停者模式將多對(duì)多的相互作用轉(zhuǎn)化為一對(duì)多的相互作用。調(diào)停者模式將對(duì)象的行為和協(xié)作抽象化,把對(duì)象在小尺度的行為上與其他對(duì)象的相互作用分開(kāi)處理。
2. 使用的原因
當(dāng)對(duì)象之間的交互操作很多,且每個(gè)對(duì)象的行為操作都依賴彼此時(shí),為防止在修改一個(gè)對(duì)象的行為時(shí),同時(shí)涉及到修改很多其他對(duì)象的行為,可采用調(diào)停者模式,來(lái)解決緊耦合問(wèn)題.
該模式將對(duì)象之間的多對(duì)多關(guān)系變成一對(duì)多關(guān)系,調(diào)停者對(duì)象將系統(tǒng)從網(wǎng)狀結(jié)構(gòu)變成以調(diào)停者為中心的星形結(jié)構(gòu),達(dá)到降低系統(tǒng)的復(fù)雜性,提高可擴(kuò)展性的作用.
3. 適用的情況舉例
eg1. WTO組織:它是一個(gè)協(xié)調(diào)組織,它將各貿(mào)易區(qū)自行進(jìn)行的相互協(xié)調(diào)的強(qiáng)耦合變成了松散合;
eg2. 4個(gè)MM打麻將,相互之間誰(shuí)應(yīng)該給誰(shuí)多少錢算不清楚了,某人擔(dān)任調(diào)停者,各MM按照各自的籌碼數(shù)算錢,賺了錢的從調(diào)停者這里拿,賠了錢的也付給調(diào)停者;
eg3. 租賃中介:很多人有出租房子的需求,也有不少人需要租房,租賃中介在其中擔(dān)任了調(diào)停者的角色, 疏通了兩者之間的復(fù)雜關(guān)系,也方便了兩者。
4. 類圖結(jié)構(gòu)及說(shuō)明
1)示意性類圖如下所示:

2)類說(shuō)明
i)Mediator:抽象調(diào)停者角色,它定義出同事對(duì)象到調(diào)停者對(duì)象得接口,這個(gè)角色一般由Java抽象類實(shí)現(xiàn)
ii)ConcreteMediator:具體調(diào)停者模式,從抽象調(diào)停者繼承,實(shí)現(xiàn)了超類所聲明的事件方法,它從具體同事對(duì)象接收消息,向具體同事對(duì)象發(fā)出命令.
iii)Colleague:抽象同事類角色,它定義了調(diào)停者同事對(duì)象的接口,它只知道調(diào)停者而不知道其余同事對(duì)象.
iv)colleague1、colleague2:具體同事類角色,從抽象同事類繼承而來(lái),每個(gè)具體同事類都知道本身在小范圍內(nèi)的行為,而不知道它在大范圍內(nèi)的目的.
5. 使用舉例
1)需求
有次去佛山開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們項(xiàng)目組要去現(xiàn)場(chǎng)開(kāi)發(fā),開(kāi)發(fā)時(shí)間為一個(gè)月,PM打算到附近租個(gè)房子,但因?qū)Ψ鹕讲皇煜ぃ乙驗(yàn)橹蛔庖粋€(gè)月,很多房東都不愿意租,所以找個(gè)合適的房子真是難上加難。
2)分析
很多的房東需要出租自己的房子,而有很多的房客需要租房子,房屋需求和供給之間存在著錯(cuò)綜復(fù)雜的關(guān)系,為解決這種錯(cuò)綜復(fù)雜的關(guān)系,我們考慮運(yùn)用弄個(gè)“中介者”出來(lái),這樣房東和房客都只需要跟這個(gè)中介打交道,方便了兩者,嘻嘻,當(dāng)時(shí)我們找了個(gè)房屋租賃中介,在短期內(nèi)以2800元的價(jià)格租了個(gè)套間,當(dāng)然還付出了不少的中介費(fèi):)
3)代碼參考實(shí)現(xiàn)
i)抽象同事類

public abstract class Colleague
{
privat Mediator mediator;


/** *//**
* 構(gòu)造函數(shù)
*/

public Colleague(Mediator mediator)
{
this.mediator = mediator;
}


/** *//**
* 獲得調(diào)停者對(duì)象
*/

public Mediator getMediator()
{
return mediator;
}


/** *//**
* 具體行為,由子類實(shí)現(xiàn)
*/
public abstract void action();
}
ii) 具體同事類
a) 房東類

public class Landlord extends Colleague
{

public Landlord(Mediator mediator)
{
super(mediator);
}


/** *//**
* 房東具體的行為方法,例如,將房間資料交給中介等
*/

public void action()
{
System.out.println("進(jìn)行將房間資料交給中介等操作,

省略");
}
}
b) 房客

public class Lodger extends Colleague
{

public Lodger(Mediator mediator)
{
super(mediator);
}


/** *//**
* 房客具體的行為方法,例如,將租房需求交給中介等
*/

public void action
{
System.out.println("進(jìn)行將租房需求交給中介等操作,

省略");
}
}
iii)抽象調(diào)停者角色

public abstract class Mediator
{
public abstract void colleagueChanged(Colleague

colleage);
}
iv)具體調(diào)停者角色

public class ConcreteMediator extends Mediator
{
private Landlord landlord;
private Lodger lodger;


public void colleagueChanged(Colleague colleague)
{
landlord.action();
lodger.action();
}


/** *//**
* 工廠方法,創(chuàng)建同事對(duì)象
*/

public void createConcreteMediator()
{
landlord = new Landlord(this);
lodger = new Lodger(this);
}

//省略房東與房客的getter方法
}
參考書籍:《Java與模式》
《Patterns in Java》
posted on 2007-04-14 11:24
阿蜜果 閱讀(4120)
評(píng)論(3) 編輯 收藏 所屬分類:
Design Pattern