前言 :
您 打算使用某個程式庫來開發您的應用程式,程式庫中可能有Some、Other與Another等類別,您的應用程式也許會像這樣撰寫來完成某個(些)動作.
您的應用程式直接使用了程式庫中所提供的各種API,也就是應用程式直接與程式庫有了高度耦合,這有幾個問題值得討論,將來程式庫異動,您的應用程式中與 該程式庫相關部份,都要一一找出修改,如果未來有更換程式庫的可能性,這種設計方式顯然地屆時必須作出大幅修改.
Facade 模式 :
您可以檢視應用程式使用這些程式庫的方式,釐出一個入口(Facade)介面,讓對程式庫的依賴實現在對介面的實作上,例如 :
而應用程式僅依賴在入口介面上 :
應 用程式不需要再知曉程式庫各種API的存在,因而不會對程式庫產生耦合,如果您從另一個角度來想,ActionService若是由熟悉程式庫的開發人員 所撰寫,提供給另一個撰寫Application的開發人員所使用,則後者並不用一定得知曉程式庫如何使用,有利於分工合作,將來就算開發 ActionService的開發人員改寫或重新實作了另一個Service類別,撰寫Application的開發人員也無需修改寫它的程式!
這是Facade模式的例子,Facade模式可以簡化程式庫的使用、隱藏所依賴的程式庫、降低對程式庫的耦合、有利於分工合作。Facade模式的UML 結構如下 :
Facade模式隱藏了各個元件之間的合作行為,以及元件本身的操作與設定細節,固而必失去了一些直接操作元件的方便性,所以對於喜歡追求 與操作細節的程式設計人員而言,不會很喜歡透過Facade來操作背後的元件,所以您的Facade介面設計,通常要在元件依賴性及元件的支接操作性之間 作個平衡.
補充說明 :
* Gossip@Caterpillar : Design Pattern - Facade
* Wiki : Facade pattern
您 打算使用某個程式庫來開發您的應用程式,程式庫中可能有Some、Other與Another等類別,您的應用程式也許會像這樣撰寫來完成某個(些)動作.
- class Application {
- void doAction() {
- Some some = new Some();
- Other other = new Other();
- Another another = new Another();
- //..讓這些物件作一些互動以產生結果
- }
- }
Facade 模式 :
您可以檢視應用程式使用這些程式庫的方式,釐出一個入口(Facade)介面,讓對程式庫的依賴實現在對介面的實作上,例如 :
- interface Service {
- void doAction();
- }
- class ActionService implements Service {
- public void doAction() {
- Some some = new Some();
- Other other = new Other();
- Another another = new Another();
- //..作一些互動以產生結果
- }
- }
- class Application {
- private Service service;
- Application(Service service) {
- this.service = service;
- }
- void doAction() {
- service.doAction();
- }
- }
這是Facade模式的例子,Facade模式可以簡化程式庫的使用、隱藏所依賴的程式庫、降低對程式庫的耦合、有利於分工合作。Facade模式的UML 結構如下 :
Facade模式隱藏了各個元件之間的合作行為,以及元件本身的操作與設定細節,固而必失去了一些直接操作元件的方便性,所以對於喜歡追求 與操作細節的程式設計人員而言,不會很喜歡透過Facade來操作背後的元件,所以您的Facade介面設計,通常要在元件依賴性及元件的支接操作性之間 作個平衡.
補充說明 :
* Gossip@Caterpillar : Design Pattern - Facade
* Wiki : Facade pattern
This message was edited 2 times. Last update was at 07/03/2011 13:24:18
沒有留言:
張貼留言