場景:
當客戶端訪問一個子系統中的多個子模塊的方法時,既能簡單的使用這些子系統內部的模塊功能,而又不用客戶端
去與子系統內部的多個模塊交互.
比如舉辦一個會議,需要首先預約時間,然後準備會議室,接着就是開會,最後是總結會議成果。如果沒有助理,這些
事情我都要自己去一個一個親自去準備,並且必須知道每一步的具體步驟,這樣不但增加了我開會所用的時間也增加了
開一次會議的複雜度。所以我希望有助理能幫我處理這個會議的步驟,然後助理指派手下的4個實習生去準備,實習生A
來負責預約時間,實習生B負責準備會議室,實習生C負責召集開會人員,實習生D負責會議總結,這個助理就是這樣一個外
觀接口,所有實習生都是負責開會這樣一個系統需求的子模塊,但有時候我想要進行電話會議,就不需要準備會議室的步
驟,那麼我直接找A幫忙預約時間打電話就好,也就不需要助理當中間人了.
定義:
爲子系統中的一組接口提供一個一致的界面,Facade(外觀)模式定義了一個高層接口,這個接口使得這一子系統
更加容易使用。
角色:
Facade: 定義子系統的多個模塊對外的高層接口,通常需要調用內部多個模塊,從而把客戶的請求代理給適當的子系
統對象
package com.kris.study;
public class Facade {
private Facade(){}
public static void kaiHui(){
new FreshManA().time();
new FreshManB().getReady();
new FreshManC().start();
new FreshManD().summary();
}
}
子系統模塊:接受Facade對象的委派,真正實現功能,各個模塊之間可能有交互。Facade知道各個模塊,但是
各個模塊不一定知道Facade對象。比如實習生只知道助理叫什麼,但是不知道她的名字和所負責的工作。
package com.kris.study;
public class FreshManA {
public void time(){
System.out.println("預約時間");
}
}
package com.kris.study;
public class FreshManB {
public void getReady(){
System.out.println("準備會議室");
}
}
package com.kris.study;
public class FreshManC {
public void start(){
System.out.println("舉行會議");
}
}
package com.kris.study;
public class FreshManD {
public void summary(){
System.out.println("總結");
}
}
Client客戶端:可以直接和Facade交互也可以單獨調用子模塊功能
package com.kris.study;
public class Client {
public static void main(String[] args) {
Facade.kaiHui();
// new FreshManA().time();
}
}
原理分析:
外觀模式的目的不是給子系統增加新的功能接口,而是爲了讓外部減少與子系統內部多個模塊的直接交互,鬆散耦
合,從而讓外部能夠簡單的使用子系統,並且防止重複調用相同的代碼.所以Facade的方法本身不進行功能的處理,只是
實現一個功能的組合調用。
外觀模式的本質是:封裝交互,簡化調用