2009-11-23 32 views
6

我如何知道在我的應用程序開發中,我需要一個立面圖案?立面圖案的使用

如何繪製立面圖案和模板圖案之間的界線?

例如:在[this]文章中,我們看到,int placeOrder(int CustomerID, List<BasketItem> Products)在算法中有許多預定義的步驟。那麼爲什麼作者不在這裏使用模板模式?

+3

通過在正面和模板之間畫線,你的意思是什麼?外觀是一種結構模式,模板是一種行爲模式 - 我不知道你如何將兩者聯繫起來? – RichardOD 2009-11-23 08:52:37

回答

9

門面處理接口,而不是實現。它的目的是隱藏內部簡單的界面,看起來很簡單。在你的問題的例子中,Facade在一個方法後面隱藏了四個類(Order,OrderLine,Address,BasketItem)。

模板方法處理實現。其目的是從幾個不同的'通過填空'方式提取常用算法。超類中的模板方法實現了通用算法,每個子類都以自己特定的方式「填充空白」。

那麼爲什麼作者不使用模板模式?

如果有幾個相似版本的操作,那麼將placeOrder作爲模板方法是有意義的。也許有幾種方法,如placePhoneOrder,placeInternetOrder,placeManuallyEnteredOrder可以重構爲單個模板placeOrder,某些子類僅實現{手機,互聯網,手動}特定的差異。

+0

非常好!我從中找到了我所需要的。 – anonymous 2009-11-23 09:34:37

3

假設你有一些服務,庫或其他。這些庫需要互操作才能執行一些更高級別的服務。然後,您可能希望將這些調用和初始化代碼封裝在一起,並提供一些功能來隱藏這些細節,並使這些服務在特定情況下使用變得簡單。那麼這對於門面模式很有用。

更新:在文章中提到的PlaceOrder方法有一個適用於所有訂單的單一實現。模板模式旨在規定一系列必須遵循的步驟,但允許子類提供這些固定步驟的定製實現。例如,如果您需要處理與電視訂單不同的微波訂單,您可以使用模板模式重新定義一些想象中的DispatchParcel方法(將微波作爲簡單包發送,但電視具有額外服務以幫助將重型設備提升到上層)。在我們的例子中,不需要重新實現ProcessOrder步驟,因此不需要模板模式,因爲一個實現適用於所有類型的訂單。