標籤:
FACADE模式
Db類使得Application類不需要瞭解System.Data命名空間中的內部細節。它把System.Data的所有通用性和複雜性隱藏在一個非常簡單且特定的介面後面。
像Db這樣的FACADE類對System.Data的使用施加了許多規約。它知道如何初始化和關閉資料庫連接。它知道如何將ProductData的成員變數轉換成資料庫欄位,或反之。它知道如何去構建合適的查詢和命令去操縱資料庫。它對使用者隱藏了所有的複雜性。在Application看來,System.Data是不存在的,它隱藏在FACADE後面。
使用FACADE模式意味著開發人員已經接受了所有資料庫調用都要通過Db類的約定。如果Application的任意一部分代碼越過該FACADE直接去訪問System.Data,那麼就違反了該約定。像這樣,該FACADE對Application施加了它的規約。基於約定,Db類稱為了System.Data的唯一代理。
可以使用FACADE對程式的任何部分進行隱藏。不過,最常見的做法是使用FACADE來隱藏資料庫,因此該模式也稱為TABLE DATA GATEWAY。
MEDIATOR模式
MEDIATOR模式同樣也是施加規約。不過,FACADE模式是以可見且強制的方式施加它的規約,而MEDIATOR模式則是以隱藏切自由的方式來施加它的規約的。
using System;using System.win.Windows.Form;public class QuickEntryMediator{ private TextBox itsTextField; private ListBox itsList; public QuickEntryMediator(TextBox t, ListBox l) { itsTextField = t; itsList = l; itsTextField.TextChagned += new EventHandler(TextFieldChanged); } private void TextFieldChanged(object sender, EventArgs args) { String prefix = itsTextField.getText(); if (prefix.length() == 0) { itsList.ClearSelection(); return; } ListBox.ObjectCollection listItems = itsList.Items; boolean found = false; for (int i = 0; found == false && i < listItems.Count; i++) { Object o = listItems[i]; String s = o.ToString(); if (s.StartsWith(prefix)) { itsList.SetSelected(i, true); found = true; } } if (!found) { itsList.ClearSelection(); } }}
ListBox和TextBox的使用者並不知道該MEDIATOR的存在。它安靜的獃著,把它的規約施加在那些對象上,而無需它們的允許或知曉。
結論
如果規約涉及的範圍廣泛並且可見,那麼可以使用FACADE模式從上施加規約。另一方面,如果規約設計的範圍較小並且可以自由定製,那麼MEDIATOR模式是更好的選擇。FACADE模式通常是約定的關注點。每個人都同意去使用該FACADE而不是隱藏於其下的對象。另一方面,MEDIATOR則對使用者是隱藏的。它的規約是既成事實而不是一項約定事務。
摘錄自:[美]RobertC.Martin、MicahMartin著,鄧輝、孫鳴譯 敏捷式軟體開發 (Agile Software Development)原則、模式與實踐(C#版修訂版) [M]、人民郵電出版社,2013、240-243、
敏捷式軟體開發 (Agile Software Development) – FACADE模式和MEDIATOR模式