標籤:style blog http color 使用 2014
1.什麼是面板模式
為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用
2.為什麼要使用面板模式
在軟體開發系統中,客戶程式經常會與複雜系統的內部子系統之間產生耦合,從而導致客戶程式隨著子系統的變化而變化,那麼如何簡化客戶程式與子系統之間的互動介面?如何將複雜系統的內部子系統與客戶程式之間的依賴解耦?
現在來考慮這樣一個抵押系統,當有一個客戶來時,有如下幾件事情需要確認:
到銀行子系統查詢他是否有足夠多的存款,到信用子系統查詢他是否有良好的信用,到貸款子系統查詢他有無貸款劣跡。只有這三個子系統都通過時才可進行抵押。我們先不考慮Facade模式,那麼客戶程式就要直接存取這些子系統,分別進行判斷。
private static void Main(string[] args) { //外觀,封裝子系統 Mortgage mortgage = new Mortgage(); Customer customer = new Customer("Ann McKinsey"); bool eligable = mortgage.IsEligible(customer, 125000); Console.WriteLine("\n" + customer.Name + " has been " + (eligable ? "Approved" : "Rejected")); Console.ReadLine(); } //顧客類 public class Customer { private string _name; public Customer(string name) { this._name = name; } public string Name { get { return _name; } } } //銀行子系統 public class Bank { public bool HasSufficientSavings(Customer c, int amount) { Console.WriteLine("Check bank for " + c.Name); return true; } } //信用子系統 public class Credit { public bool HasGoodCredit(Customer c) { Console.WriteLine("Check credit for " + c.Name); return true; } } //貸款子系統 public class Loan { public bool HasNoBadLoans(Customer c) { Console.WriteLine("Check loans for " + c.Name); return true; } } public class Mortgage { private Bank bank = new Bank(); private Loan loan = new Loan(); private Credit credit = new Credit(); public bool IsEligible(Customer cust, int amount) { Console.WriteLine("{0} applies for {1:C} loan\n", cust.Name, amount); bool eligible = true; if (!bank.HasSufficientSavings(cust, amount)) { eligible = false; } else if (!loan.HasNoBadLoans(cust)) { eligible = false; } else if (!credit.HasGoodCredit(cust)) { eligible = false; } return eligible; } }
可以看到引入Facade模式後,客戶程式只與Mortgage發生依賴,也就是Mortgage屏蔽了子系統之間的複雜的操作,達到瞭解耦內部子系統與客戶程式之間的依賴。
Facade模式在實際開發中最多的運用當屬開發N層架構的應用程式了