設計模式——中介者

我的在CSDN的BLOG:http://blog.csdn.net/feb13/article/details/7906868java

MEDIATOR 中介者設計模式

 參考《設計模式——可複用面向對象軟件的基礎》和《研磨設計模式》的讀書筆記。ide

一、 意圖this

用一箇中介者對象來封裝一系列的對象交互。中介者使其各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立改變它們之間的交互。.net

二、 適用性設計

  • 一組對象以定義好可是複雜的方式進行通訊。產生的相互依賴關係結構混亂且難以理解。
  • 一個對象引用其餘很對對象而且直接與這些對象通訊,致使難以複用該對象。
  • 想制定一個分佈在多個類中的行爲,而又不想生成太多的子類。

三、 結構code


四、 參與者server

Mediatord(中介者)對象

                            ——中介者定義一個接口用於與各同事(Colleague)對象通訊。blog

ConcreteMediator(具體中介者)

                            ——瞭解中介者經過協調各同事對象實現協做行爲。

                           ——瞭解並維護它的各個同事。

ColleagueClass(同事類,包括其子類)

                           ——每個同事類都知道它的中介者對象。

                           ——每個同事類對象在需與其餘同事通訊的時候,與它的中介者通訊。

五、 協做

同事向一箇中介者對象發送和接收請求。中介者在各同事間適當地轉發請求以實現協做行爲。

六、 效果

1)  減小了子類生成;Mediator將本來分佈於多個對象間的行爲集中在一塊兒。改變這些行爲只須要生成Mediator的子類便可。這樣各個Colleague類可被重用。

2)  它將各Colleague解耦;Mediator有利於各Colleague間的鬆耦合。你能夠獨立地改變和複用Colleague類和Mediator類。

3)  它簡化了對象協議;用Mediator和各Colleague間的一對多的交互來代替多對多的交互。一對多的關係更易於理解、維護和擴展。

4)  它對對象如何協做進行了抽象;將中介做爲一個獨立的概念並將其封裝在一個對象中,使你將注意力從對象各自自己的行爲轉移到它們之間的交互上來。這有助於弄清楚一個系統中的對象是如何交互的。

5)  它使控制集中化;中介者模式將交互的複雜性變爲中介者的複雜性。由於中介者封裝了協議,它可能變得比任一個Colleague都複雜。這可能使得中介者自身成爲一個難以維護的龐然大物。

七、 實現

1)   忽略抽象的Mediator類;當各Colleague僅與一個Mediator一塊兒工做時,沒有必要定義一個抽象的Mediator類。Mediator類提供的抽象耦合已經使各Colleague可與不一樣的Mediator子類一塊兒工做,反之亦然。

2)  Colleague——Mediator通訊;當一個感興趣的事件發生時,Colleague必須與其Mediator通訊。一種實現方法是 Observer模式,將Mediator實現爲一個Observer,各Colleague做爲Subset,一旦其狀態改變就發送通知給 Mediator;一種方法是在Mediator中定義一個特殊的通知接口,各Colleague在通訊時直接調用該接口。

八、 代碼示例

Mediatord

package com.examples.pattern.mediator;

/**
 * 中介者,定義各個同事對象通訊的接口
 */
public interface Mediator {

	/**
	 * 同事對象自身改變的時候來通知中介者的方法 讓中介者去負責相應的與其餘同事對象的交互
	 * 
	 * @param colleague
	 *            同事對象自身,好讓中介者對象經過對象實例去得到同事對象的狀態
	 */
	public void changed(Colleague colleague);
}

ConcreteMediator

package com.examples.pattern.mediator;

/**
 * 具體的中介者實現
 */
public class ConcreteMediator implements Mediator {

	/**
	 * 持有並維護同事A
	 */
	private ConcreteColleagueA colleagueA;
	/**
	 * 持有並維護同事B
	 */
	private ConcreteColleagueB colleagueB;

	/**
	 * 設置中介者須要瞭解並維護的同事A對象
	 * @param colleagueA
	 */
	public void setColleagueA(ConcreteColleagueA colleagueA) {
		this.colleagueA = colleagueA;
	}

	/**
	 * 設置中介者須要瞭解並維護的同事B對象
	 * @param colleagueB
	 */
	public void setColleagueB(ConcreteColleagueB colleagueB) {
		this.colleagueB = colleagueB;
	}

	@Override
	public void changed(Colleague colleague) {
		System.out.println(colleague);
	}

}

 Colleague Class

package com.examples.pattern.mediator;

/**   
* 同事類的抽象父類       
*/
public abstract class Colleague {

	/**
	 * 持有中介者對象,每個同事類都知道它的中介者對象
	 */
	private Mediator mediator;

	/**
	 * 構造者方法,傳入中介者對象
	 * @param mediator
	 */
	public Colleague(Mediator mediator) {
		this.mediator = mediator;
	}

	/**
	 * 得到當前同事類對應的中介者對象
	 * @return
	 */
	public Mediator getMediator() {
		return mediator;
	}
	
	
	
}
package com.examples.pattern.mediator;

/**   
*  具體的同事類A      
*/
public class ConcreteColleagueA extends Colleague {

	public ConcreteColleagueA(Mediator mediator) {
		super(mediator);
	}
	
	public void someOperation(){
		//在須要跟其餘同事通訊的時候,通知中介者對象
		getMediator().changed(this);
	}

}
package com.examples.pattern.mediator;

public class ConcreteColleagueB extends Colleague {

	public ConcreteColleagueB(Mediator mediator) {
		super(mediator);
	}
	
	public void someOperation(){
		//在須要跟其餘同事通訊的時候,通知中介者對象
		getMediator().changed(this);
	}

}

Client

 

package com.examples.pattern.mediator;

public class Client {

	public static void main(String[] args) {
		ConcreteMediator mediator = new ConcreteMediator();
		ConcreteColleagueA ca = new ConcreteColleagueA(mediator);
		ConcreteColleagueB cb = new ConcreteColleagueB(mediator);
		
		mediator.setColleagueA(ca);
		mediator.setColleagueB(cb);
		
		ca.someOperation();
		cb.someOperation();
		
		
	}

}

九、 相關模式

Façade與中介者的不一樣之處在於它是對 一個對象子系統進行抽象,從而提供了一個更方便的接口。它的協議是單向的,即Façade對象對這個子系統類提出請求,但反之則不行。相 反,Mediator提供了各Colleague對象不支持或不能支持的協做行爲,並且協議是多向的。

Colleague可以使用Observer模式與Mediator通訊。

十、 廣義中介者

在咱們的一般使用中,常常會簡化中介者模式,來使開發變得簡單,有以下變化:

  • 一般會去掉同事對象的父類,這樣可讓任意的對象,只要須要相互交互,就能夠成爲同事。
  • 一般不定義Mediator接口,把具體的中介者對象實現成單例。
  •  同事對象再也不持有中介者,而是在須要的時候直接獲取中介者對象並調用;中介者也再也不持有同事對象,而是在具體處理方法裏面去建立,或者獲取,或者從參數傳入須要的同事對象。
相關文章
相關標籤/搜索