1、定義設計模式
外觀模式:爲子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。ide
解釋:簡單來講,客戶端須要調用一個特別複雜的子系統中的多個接口,若是直接調用邏輯處理起來會很是複雜,並且不便於系統擴展。外觀模式把這個複雜的子系通通一塊兒來,提供幾個高層接口,以備客戶端進行調用。通俗來講是:子系統是一個黑匣子,提供若干個透明接口以備調用。spa
2、UML類圖及基本代碼設計
基本代碼:code
class Program { static void Main(string[] args) { Facade facade = new Facade(); facade.MethodA(); facade.MethodB(); Console.Read(); } } class Facade { SubSystemOne systemOne; SubSystemTwo systemTwo; SubSystemThree systemThree; public Facade() { systemOne = new SubSystemOne(); systemTwo = new SubSystemTwo(); systemThree = new SubSystemThree(); } public void MethodA() { Console.WriteLine("\n方法組A()---"); systemOne.MethodOne(); systemThree.MethodThree(); } public void MethodB() { Console.WriteLine("\n方法組B()---"); systemOne.MethodOne(); systemTwo.MethodTwo(); } } class SubSystemOne { public void MethodOne() { Console.WriteLine("子系統方法一"); } } class SubSystemTwo { public void MethodTwo() { Console.WriteLine("子系統方法二"); } } class SubSystemThree { public void MethodThree() { Console.WriteLine("子系統方法三"); } }
3、舉例說明對象
一學校選課系統中有註冊課程子系統和通知系統。正常狀況下,須要一一調用註冊課程系統和通知系統。若是使用外觀模式,將註冊課程系統和通知系統包裝起來,爲其提供一個統一接口以供學生調用。代碼以下:blog
class Program { private static RegistrationFacade facade = new RegistrationFacade(); static void Main(string[] args) { if (facade.RegisterCourse("設計模式", "studentA")) { Console.WriteLine("選課成功"); } else { Console.WriteLine("選課失敗"); } Console.Read(); } } public class RegistrationFacade { private RegisterCourse registerCourse; private NotifyStudent notifyStudent; public RegistrationFacade() { registerCourse = new RegisterCourse(); notifyStudent = new NotifyStudent(); } public bool RegisterCourse(string courseName, string studentName) { if (!registerCourse.CheckAvailable(courseName)) { return false; } return notifyStudent.Notify(studentName); } } public class RegisterCourse { public bool CheckAvailable(string courseName) { Console.WriteLine("正在驗證課程{0}是否人數已滿", courseName); return true; } } public class NotifyStudent { public bool Notify(string studentName) { Console.WriteLine("正在向{0}發出通知", studentName); return true; } }
4、優缺點及使用場景接口
優勢:string
1)外觀模式對客戶端屏蔽了子系統組件,從而簡化了接口,減小了客戶端處理的對象數目並使子系統的使用更加簡單。it
2)外觀模式實現了子系統與客戶之間的鬆耦合關係,而子系統內部的功能組件是緊耦合的。鬆耦合使得子系統的組件變化不會影響到它的客戶端。
缺點:
增長新的子系統可能須要修改外觀類或客戶端,違背了「開閉原則」。
使用場景:
1)爲一個複雜的子系統提供一個簡單的接口。
2)在層次化結構中,可使用外觀模式定義系統中每一層的入口。
3)子系統須要獨立性。