zoukankan      html  css  js  c++  java
  • 设计模式——12.外观模式

    外观模式(Facade)

    外观模式(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

  • 相关阅读:
    Httprunner生成Allure格式HTML报告
    Go语言编写单元测试用例
    dotnet 在 UOS 国产系统上安装 dotnet sdk 的方法
    dotnet 在国产 UOS 系统利用 dotnet tool 工具做文件传输
    webpack丑化插件
    webpack自动生成html
    webpack vue
    webpack vue
    HO引擎近况20210225
    常用十大算法(三)— 动态规划算法
  • 原文地址:https://www.cnblogs.com/sylvan/p/10127548.html
Copyright © 2011-2022 走看看