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