設計模式(13)---外觀模式

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("子系統方法三");
        }
    }
View Code

 

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)子系統須要獨立性。

相關文章
相關標籤/搜索