1. 程式人生 > >設計模式——12.外觀模式

設計模式——12.外觀模式

外觀模式(Facade)

外觀模式(Facade)簡介:

外觀模式為子系統中的一組介面提供一個已知的介面,即定義一個高層介面,使子系統更加容易使用

外觀模式體現了依賴倒轉原則迪米特法則的思想,是常用的設計模式。

外觀模式結構:

C++程式碼

子系統類:


    //file: SubSystem.h
    #pragma once
    class SubSystemA
    {
    public:
        SubSystemA();
        virtual ~SubSystemA();
        
        void featureA();
    };
    
    class SubSystemB
    {
    public:
        SubSystemB();
        virtual ~SubSystemB();
    
        void featureB();
    };
    
    class SubSystemC
    {
    public:
        SubSystemC();
        virtual ~SubSystemC();
    
        void featureC();
    };

    //file: SubSystem.cpp
    #include "pch.h"
    #include "SubSystem.h"
    #include <iostream>
    
    ///SubSystemA
    SubSystemA::SubSystemA() {}
    
    SubSystemA::~SubSystemA() {}
    
    void SubSystemA::featureA()
    {
        std::cout << "SubSystemA's Feature A ." << std::endl;
    }
    
    ///SubSystemB
    SubSystemB::SubSystemB() {}
    
    SubSystemB::~SubSystemB() {}
    
    void SubSystemB::featureB()
    {
        std::cout << "SubSystemB's Feature B ." << std::endl;
    }
    
    ///SubSystemC
    SubSystemC::SubSystemC() {}
    
    SubSystemC::~SubSystemC() {}
    
    void SubSystemC::featureC()
    {
        std::cout << "SubSystemC's Feature C ." << std::endl;
    }

外觀類:


    //file: Facade.h
    #pragma once
    #include "SubSystem.h"
    
    class Facade
    {
    public:
        Facade();
        virtual ~Facade();
    
        void Operation();
    
    private:
        SubSystemA *m_SA;
        SubSystemB *m_SB;
        SubSystemC *m_SC;
    };

    //file: Facade.cpp
    #include "pch.h"
    #include "Facade.h"
    #include <iostream>
    
    Facade::Facade()
    {
        m_SA = new SubSystemA();
        m_SB = new SubSystemB();
        m_SC = new SubSystemC();
    }
    
    Facade::~Facade()
    {
        delete m_SA;
        delete m_SB;
        delete m_SC;
    }
    
    void Facade::Operation()
    {
        m_SA->featureA();
        m_SB->featureB();
        m_SC->featureC();
    }

客戶端呼叫:


    //file: FacadePattern.cpp : This file contains the 'main' function. Program execution begins and ends there.
    #include "pch.h"
    #include "Facade.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
        Facade facade;
        facade.Operation();
    
        return 0;
    }

C#程式碼

子系統類:


    public class SubSystemA
    {

        public void Feature1()
        {
            Console.WriteLine("SubSystemA's Feature 1 .");
        }

        public void Feature2()
        {
            Console.WriteLine("SubSystemA's Feature 2 .");
        }
    }

外觀類:


    class Facade
    {
        private SubSystemA subA = null;
        private SubSystemB subB = null;
        private SubSystemC subC = null;

        public Facade()
        {
            subA = new SubSystemA();
            subB = new SubSystemB();
            subC = new SubSystemC();
        }

        public void Func1()
        {

            subA.Feature1();
            subB.Feature1();
            subC.Feature1();
        }

        public void Func2()
        {
            subA.Feature2();
            subB.Feature2();
            subC.Feature2();
        }
    }

客戶端測試:


    class Program
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();

            facade.Func1();

            Console.WriteLine("__________");

            facade.Func2();

            Console.ReadKey();
        }
    }

外觀模式的優點及缺點

優點:

使用外觀模式之後,外觀類可以給客戶端提供單一操作介面,減少了不必要的類引用以及功能的整合。

缺點:

因為是將所有子系統都集中在Facade類中,當子系統過多時,,則會導致Facade類過於龐大而較難維護,此時,可以對Facade進行重構,將功能相近的子系統進行整合,減少內部的依賴性。

REF

書籍:

設計模式與遊戲開發、大話設計模式

GitHub:

https://github.com/me115/design_patterns