一、外观模式的概念
外观模式为一组具有类似功能的类或者子系统,提供一个统一的高层接口,以供客户端调用,使得客户端调用这些类或者子系统更加的容易。
二、外观模式使用场景
1、当需要为一个复杂的子系统提供一个简单的对外接口时可以使用外观模式。
2、当客户端需要调用多个子系统时,可以使用外观类将子系统和客户端解耦合,提高子系统的可移植性。
三、外观模式构建方法
1、外观类
外观模式的核心,为客户端定义一个简单的统一接口。
2、子系统类
功能提供者,可以同时包含一个或者多个子系统,该子系统类可以被客户端直接调用或者处理外观类发送过来的请求,外观类对该子系统而言也是一个客户端。
四、外观模式的示例
// FacadePattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
using namespace std;
// 鸿蒙操作系统
class HarmonyOS
{
public:
void printOS()
{
cout << "Hello,I'm HarmonyOS!" << endl;
}
};
// windows操作系统
class WindowsOS
{
public:
void printOS()
{
cout << "Hello,I'm WindowsOS!" << endl;
}
};
// 苹果操作系统
class AppleIOS
{
public:
void printOS()
{
cout << "Hello,I'm AppleIOS!" << endl;
}
};
// 外观类
class Facade
{
public:
Facade()
{
m_pHarmonyOS = new HarmonyOS;
m_pWindowsOS = new WindowsOS;
m_pAppleIOS = new AppleIOS;
}
~Facade()
{
DELETE_PTR(m_pHarmonyOS);
DELETE_PTR(m_pWindowsOS);
DELETE_PTR(m_pAppleIOS);
}
void printOS()
{
m_pHarmonyOS->printOS();
m_pWindowsOS->printOS();
m_pAppleIOS->printOS();
}
private:
HarmonyOS *m_pHarmonyOS;
WindowsOS *m_pWindowsOS;
AppleIOS *m_pAppleIOS;
};
int main()
{
cout << "------------外观模式-------------" << endl;
cout << "========通过外观类调用子系统=======" << endl;
Facade *pFacade = new Facade;
pFacade->printOS();
DELETE_PTR(pFacade);
cout << "========在客户端中直接调用子系统=======" << endl;
HarmonyOS *pHarmonyOS = new HarmonyOS;
WindowsOS *pWindowsOS = new WindowsOS;
AppleIOS *pAppleIOS = new AppleIOS;
pHarmonyOS->printOS();
pWindowsOS->printOS();
pAppleIOS->printOS();
DELETE_PTR(pHarmonyOS);
DELETE_PTR(pWindowsOS);
DELETE_PTR(pAppleIOS);
std::cout << "Hello World!\n";
getchar();
}
运行结果:
五、外观模式的优缺点
优点:
1、为客户端的调用提供一个统一得简单接口,方便使用。
2、降低了子系统和客户端之间的耦合性,实现了客户端和子系统的松耦合。
3、为客户端提供了一个统一的接口,但是并不影响客户端直接调用子系统。
缺点:
1、当对客户端访问子系统类做太多的限制时,会减少可变性和灵活性。
2、不引入抽象外观类时,增加新的子系统,可能需要修改客户端或者外观类的源代码,违背了“开闭原则”。
能力有限,如有错误,多多指教。。。