目录
1. 外观模式介绍
2. 代码示例
1. 外观模式介绍
外观模式(或门面模式)是一种结构性模式。
外观模式为多个复杂的子系统提供一个统一的接口,使这些子系统更加容易被使用。
通俗的说,外观模式内部封装了多个复杂的子系统的调用逻辑,并对外暴露出一个简单易用的接口。客户端代码只需要和外观模式暴露出来的简单接口打交道即可,不必知道复杂子系统的使用方法。这使得客户端的代码更加简洁,外观模式把客户端和复杂子系统隔离开来,实现了解耦合。
外观模式的优点缺点如下:
优点:
- 客户端代码简化:客户端更加易于使用,客户端无需了解子系统即可进行使用
- 解耦:客户端和子系统完全解耦,客户端只需了解外观模式所暴露出来的接口即可
- 符合迪米特原则
缺点:
- 不符合开闭原则:增加新的子系统或者调整子系统的实现时,需要修改外观模式的代码。
与之前所介绍的模式不同,外观模式类似于一种思想,一种封装思想,该模式没有特定的编程手法和技巧。
2. 代码示例
下面以一个简单的示例作为演示。
假设我们正在开发一个显示器的屏幕显示设置程序,可以调节的显示器参数有亮度、对比度、饱和度,三个选项。
每一个参数调节都可以看作是一个子系统,利用外观模式进行封装。对外暴露出几个接口:游戏模式、影院模式、正常模式。每一个模式都有一组预设好的显示参数。
客户端代码可以通过外观类直接选择一种显示器模式,而无需手动调节具体的参数。
当然,如果想要手动调节的参数也是可以绕过外观类,直接和子系统打交道的。
代码演示如下:
#include <iostream>using namespace std;class Brightness
{
private:Brightness() = default;
public:static Brightness& getInstance(){static Brightness instance;return instance;}void setArg(int arg){cout << "设置亮度为:" << arg << endl;}
};class Contrast
{
private:Contrast() = default;
public:static Contrast& getInstance(){static Contrast instance;return instance;}void setArg(int arg){cout << "设置对比度为:" << arg << endl;}
};// 饱和度类
class Saturation
{
private:Saturation() = default;
public:static Saturation& getInstance(){static Saturation instance;return instance;}void setArg(int arg){cout << "设置饱和度为:" << arg << endl;}
};class Facade
{
private:Facade() = default;
public:static Facade& getInstance(){static Facade instance;return instance;}void gameMode(){Brightness::getInstance().setArg(70);Contrast::getInstance().setArg(90);Saturation::getInstance().setArg(80);}void theaterMode(){Brightness::getInstance().setArg(80);Contrast::getInstance().setArg(70);Saturation::getInstance().setArg(100);}void normalMode(){Brightness::getInstance().setArg(100);Contrast::getInstance().setArg(100);Saturation::getInstance().setArg(100);}
};void main()
{cout << "游戏模式:" << endl;Facade::getInstance().gameMode();cout << "-------------------" << endl;cout << "剧院模式:" << endl;Facade::getInstance().theaterMode();cout << "-------------------" << endl;cout << "正常模式:" << endl;Facade::getInstance().normalMode();
}
运行结果如下: