1. 程式人生 > >設計模式 (七)外觀模式(Facade)

設計模式 (七)外觀模式(Facade)

外觀模式(Facade)為了小小的糾正一下個人的口語,於是有道了一下:[fə'sɑ:d]

對於外觀模式就是為了子系統對外提供的一組介面提供一個統一的介面,似的其他系統對該系統訪問都通過一個同一段的介面來完成。

外觀模式主要由三部分組成,一箇中間類,就是Facade類,負責聯絡子系統提供對外的介面,一個是多個子系統,一個是客戶端負責通過Facade類對子系統的功能進行操作

這裡通過簡單的工廠生產帽子,被子,筆賣給消費者的過程,並且用Facade類的前後作對比來簡單的理解Facade模式:

Facade模式的原理圖:

對UML部分理解更清楚了一點,發現前面的UML好多不合理的地方,可以學習


普通基礎的設計:

package com.designpattern.facade;

public class HatFactory {
	public static void saleHat() {
		System.out.println("sale a hat");
	}
}

package com.designpattern.facade;

public class CapFactory {
	public static void saleCap() {
		System.out.println("sale a cap");
	}
}

package com.designpattern.facade;

public class PenFactory {
	public static void salePen() {
		System.out.println("sale a pen");
	}
}

package com.designpattern.facade;

public class Client {
	public static void main(String[] args) {
		CapFactory.saleCap();
		HatFactory.saleHat();
		PenFactory.salePen();
	}
}

這樣如果客戶想買各種商品的話就必須直接和廠家聯絡,然後買商品,實現起來卻是很是麻煩

但是如果引入瞭如下的Facade類就簡單多了,具體操作如下:

package com.designpattern.facade;

public class Facade {
	public static void saleHat() {
		HatFactory.saleHat();
	}

	public static void saleCap() {
		CapFactory.saleCap();
	}

	public static void salePen() {
		PenFactory.salePen();
	}
}

package com.designpattern.facade;

public class Client {
	public static void main(String[] args) {
		Facade.saleCap();
		Facade.saleHat();
		Facade.salePen();
	}
}

這樣在客戶買商品的時候只要去Facade商店就行了,直接到商店想買什麼就買什麼,具體商店和廠家怎麼聯絡的客戶是不用去理會的,這樣就對於客戶端程式設計師提供了很大的簡便可行。一些很好的持久層的框架也是用這樣一個設計模式達到一個很好的使用者體驗。

外觀模式通過提供一個統一的對外介面,避免的外部系統和子系統之間的直接聯絡從而降低了系統間的依賴和複雜度。
但是限制了外部系統對子系統呼叫的靈活性,只能按照外觀類中提供的方式對子系統進行呼叫。