設計模式之中介者模式

一、定義

用一箇中介對象來封裝一系列的對象交互。中介者使得各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。

定義的意思是:多個對象之間相互關聯,從而造成關係比較複雜,而中介者的使用降低了它們之間的耦合。我們可以用一對圖來說明:

4個對象的交互全部放在中介者當中。

二、舉例說明

舉個我們生活中的例子,就是房地產中介。其實就是個中介者模式,而購房者和房主則是對象。如果沒有房地產中介的話,購房者和房主是直接交互的。房主發佈賣房信息------購-------房者查看房子信息,如果喜歡房主的房子的話,聯繫房主-------約定看房的時間-------購房者交款------房主交房(這裏我們把關係說的簡單點)。期間如果買房者在約定看房的時間當天有其他事情,還得聯繫房主從新約定時間或者房主有其他的事情的話,還得告訴購房者從新約定時間。總之他們之間的關係耦合度很高。

如果有了房地產中介後,購房者和房主的關係就鬆散了。房主在中介那遞交了房子資料後,就不用管了,如果房子賣出後直接收錢就行。而購房者也不用和房主直接聯繫了,直接和房地產中介溝通。不會存在爽約的情況。

下面是Mediator的原型類圖:


三、代碼說明

房主:

public class FangZhu {
	
	private Mediator mediator;
	private String name = "房姐";
	
	public FangZhu(Mediator mediator){
		this.mediator = mediator;
	}
	
	public void giveHouseMaterial(){
		System.out.println("房主交個房地產中介預售房子的資料");
		mediator.houseMaterialChanged("三室兩廳120平米,房主姓名:"+name);
	}
	
	public void sellHouse(){
		System.out.println(name+"移交房子");
		mediator.getFangZhuHouse();
	}
	
	public void getMoney(int money){
		System.out.println(name+"獲得了"+money+"萬");
		sellHouse();
	}

}
購房者:

public class GouFangZhe {

	private Mediator mediator;
	
	public GouFangZhe(Mediator mediator){
		this.mediator = mediator;
	}
	
	public String lookHouseMaterial(){
		ArrayList<String> materials = mediator.getHouseMaterials();
		for(int i=0;i<materials.size();i++){
			System.out.println("購房者瀏覽房子信息"+materials.get(i));
		}
		System.out.println("喜歡上了:"+materials.get(1));
		return materials.get(1);
	}
	
	public void lookHouse(){
		System.out.println("和中介約好看房子");
	}
	
	public void giveMoney(){
		System.out.println("交給中介500萬");
		mediator.getGouFangZheMoney(500);
	}
	
	public void getHouse(){
		System.out.println("購房者獲得房子");
	}
}

房地產中介者:

public class Mediator {

	private ArrayList<String> houseMaterials = new ArrayList<String>();

	public Mediator() {
		houseMaterials.add("一室一廳36平米,房主姓名:房叔");
	}

	FangZhu fangZhu;
	GouFangZhe gouFangZhe;

	public FangZhu getFangZhu() {
		return fangZhu;
	}

	public void setFangZhu(FangZhu fangZhu) {
		this.fangZhu = fangZhu;
	}

	public GouFangZhe getGouFangZhe() {
		return gouFangZhe;
	}

	public void setGouFangZhe(GouFangZhe gouFangZhe) {
		this.gouFangZhe = gouFangZhe;
	}

	/**
	 * 有新房源的資料了
	 * 
	 * @param houseMaterial
	 */
	public void houseMaterialChanged(String houseMaterial) {
		houseMaterials.add(houseMaterial);
		String likedHouse = gouFangZhe.lookHouseMaterial();
		gouFangZhe.lookHouse();
		gouFangZhe.giveMoney();
	}

	/**
	 * 獲得房主的錢
	 * 
	 * @param money
	 */
	public void getGouFangZheMoney(int money) {
		fangZhu.getMoney(money);
	}

	/**
	 * 獲得房主的房子
	 */
	public void getFangZhuHouse() {
		gouFangZhe.getHouse();
		houseMaterials.remove(1);
	}

	public ArrayList<String> getHouseMaterials() {
		return houseMaterials;
	}

	public void setHouseMaterials(ArrayList<String> houseMaterials) {
		this.houseMaterials = houseMaterials;
	}

}

Client端:

public class Client {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Mediator mediator = new Mediator();
		FangZhu fangZhu = new FangZhu(mediator);
		GouFangZhe gouFangZhe = new GouFangZhe(mediator);
		mediator.setFangZhu(fangZhu);
		mediator.setGouFangZhe(gouFangZhe);
		
		fangZhu.giveHouseMaterial();
	}

}

執行結果:


四、總結

功能:中介者的功能非常的簡單,就是封裝對象之間的交互。

優點:

         1】鬆散耦合

         2】集中控制交互

         3】多對多變成了一對多

缺點:

         過度的集中化。如果交互的對象過多的話,而且比較複雜,當這些複雜性全部集中到中介者的時候,會導致中介者對象變的十分的複雜,而且難於管理和維護。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章