程式扎記: [OO 設計模式] Facade Pattern : 類別交互行為的封裝

標籤

2011年3月16日 星期三

[OO 設計模式] Facade Pattern : 類別交互行為的封裝


前言 :
您 打算使用某個程式庫來開發您的應用程式,程式庫中可能有Some、Other與Another等類別,您的應用程式也許會像這樣撰寫來完成某個(些)動作.
  1. class Application {  
  2.     void doAction() {  
  3.         Some some = new Some();  
  4.         Other other = new Other();  
  5.         Another another = new Another();  
  6.         //..讓這些物件作一些互動以產生結果  
  7.     }  
  8. }  
您的應用程式直接使用了程式庫中所提供的各種API,也就是應用程式直接與程式庫有了高度耦合,這有幾個問題值得討論,將來程式庫異動,您的應用程式中與 該程式庫相關部份,都要一一找出修改,如果未來有更換程式庫的可能性,這種設計方式顯然地屆時必須作出大幅修改.

Facade 模式 :
您可以檢視應用程式使用這些程式庫的方式,釐出一個入口(Facade)介面,讓對程式庫的依賴實現在對介面的實作上,例如 :
  1. interface Service {  
  2.     void doAction();  
  3. }  
  4.       
  5. class ActionService implements Service {  
  6.     public void doAction() {  
  7.         Some some = new Some();  
  8.         Other other = new Other();  
  9.         Another another = new Another();  
  10.         //..作一些互動以產生結果       
  11.     }  
  12. }  
應用程式僅依賴在入口介面上 :
  1. class Application {  
  2.     private Service service;  
  3.     Application(Service service) {  
  4.         this.service = service;  
  5.     }  
  6.     void doAction() {  
  7.         service.doAction();  
  8.     }  
  9. }  
應 用程式不需要再知曉程式庫各種API的存在,因而不會對程式庫產生耦合,如果您從另一個角度來想,ActionService若是由熟悉程式庫的開發人員 所撰寫,提供給另一個撰寫Application的開發人員所使用,則後者並不用一定得知曉程式庫如何使用,有利於分工合作,將來就算開發 ActionService的開發人員改寫或重新實作了另一個Service類別,撰寫Application的開發人員也無需修改寫它的程式!
這是Facade模式的例子,Facade模式可以簡化程式庫的使用、隱藏所依賴的程式庫、降低對程式庫的耦合、有利於分工合作。Facade模式的UML 結構如下 :


Facade模式隱藏了各個元件之間的合作行為,以及元件本身的操作與設定細節,固而必失去了一些直接操作元件的方便性,所以對於喜歡追求 與操作細節的程式設計人員而言,不會很喜歡透過Facade來操作背後的元件,所以您的Facade介面設計,通常要在元件依賴性及元件的支接操作性之間 作個平衡.

補充說明 :
Gossip@Caterpillar : Design Pattern - Facade
Wiki : Facade pattern
The facade pattern is a software engineering design pattern commonly used with Object-oriented programming. (The name is by analogy to an architectural facade.) A facade is an object that provides a simplified interface to a larger body of code, such as a class library. A facade can:
- make a software library easier to use, understand and test, since the facade has convenient methods for common tasks;
- make code that uses the library more readable, for the same reason;
- reduce dependencies of outside code on the inner workings of a library, since most code uses the facade, thus allowing more flexibility in developing the system;
- wrap a poorly-designed collection of APIs with a single well-designed API (as per task needs).

An Adapter is used when the wrapper must respect a particular interface and must support a polymorphic behavior. On the other hand, a facade is used when one wants an easier or simpler interface to work with.
This message was edited 2 times. Last update was at 07/03/2011 13:24:18

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!