外观模式——C++实现

目录

[1. 外观模式介绍](#1. 外观模式介绍)

[2. 代码示例](#2. 代码示例)


1. 外观模式介绍

外观模式 (或门面模式)是一种结构性模式

外观模式为多个复杂的子系统提供一个统一的接口,使这些子系统更加容易被使用。

通俗的说,外观模式内部封装了多个复杂的子系统的调用逻辑,并对外暴露出一个简单易用的接口。客户端代码只需要和外观模式暴露出来的简单接口打交道即可,不必知道复杂子系统的使用方法。这使得客户端的代码更加简洁,外观模式把客户端和复杂子系统隔离开来,实现了解耦合。

外观模式的优点缺点如下:

优点:

  • 客户端代码简化:客户端更加易于使用,客户端无需了解子系统即可进行使用
  • 解耦:客户端和子系统完全解耦,客户端只需了解外观模式所暴露出来的接口即可
  • 符合迪米特原则

缺点:

  • 不符合开闭原则:增加新的子系统或者调整子系统的实现时,需要修改外观模式的代码。

与之前所介绍的模式不同,外观模式类似于一种思想,一种封装思想,该模式没有特定的编程手法和技巧。

2. 代码示例

下面以一个简单的示例作为演示。

假设我们正在开发一个显示器的屏幕显示设置程序,可以调节的显示器参数有亮度、对比度、饱和度,三个选项。

每一个参数调节都可以看作是一个子系统,利用外观模式进行封装。对外暴露出几个接口:游戏模式、影院模式、正常模式。每一个模式都有一组预设好的显示参数。

客户端代码可以通过外观类直接选择一种显示器模式,而无需手动调节具体的参数。

当然,如果想要手动调节的参数也是可以绕过外观类,直接和子系统打交道的。

代码演示如下:

cpp 复制代码
#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();	
}

运行结果如下:

相关推荐
羚羊角uou12 分钟前
【C++】多态详细讲解
开发语言·c++
利刃大大1 小时前
【C++】string类的模拟实现
开发语言·c++
一只小松许️1 小时前
C++ CRTP:奇异递归模板模式的原理与应用
开发语言·c++
小乌龟不会飞1 小时前
C++的 I/O 流
c++·io流
源代码•宸3 小时前
Leetcode—734. 句子相似性【简单】Plus
c++·经验分享·算法·leetcode·哈希算法
No0d1es3 小时前
202412 青少年软件编程等级考试C/C++ 二级真题答案及解析
c语言·开发语言·c++·算法·青少年编程·电子学会·二级
CodeClimb4 小时前
【华为OD-E卷 - 113 跳格子2 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
源代码•宸4 小时前
Leetcode—487. 最大连续1的个数 II【中等】Plus
c++·经验分享·算法·leetcode·滑动窗口
《雨声》8 小时前
第3章《VTK可视化基础》
开发语言·c++·qt·算法
蚰蜒螟8 小时前
mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制
c++·mysql