设计模式之外观模式-要内在也要外表!

本文详细介绍了外观模式的概念,其核心在于为复杂子系统提供一个统一的简单接口,降低客户端与子系统间的耦合度,实现更简便的调用方式。通过示例代码展示了如何在实际项目中应用外观模式,并分析了其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、外观模式的概念

外观模式为一组具有类似功能的类或者子系统,提供一个统一的高层接口,以供客户端调用,使得客户端调用这些类或者子系统更加的容易。

二、外观模式使用场景

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、不引入抽象外观类时,增加新的子系统,可能需要修改客户端或者外观类的源代码,违背了“开闭原则”。

能力有限,如有错误,多多指教。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值