c++ 设计模式之 外观模式

本文阐述了通过统一接口实现子系统间的高效交互,利用Facade模式简化复杂系统的使用。

概念

为一系列子系统提供一个统一的接口.外关模式一个高层次的接口使子系统更加容易的使用.

类图


示例代码

#include <iostream>

// Subsystem 1
class SubSystemOne
{
public:
	void MethodOne(){ std::cout << "SubSystem 1" << std::endl; };
};

// Subsystem 2
class SubSystemTwo
{
public:
	void MethodTwo(){ std::cout << "SubSystem 2" << std::endl; };
};

// Subsystem 3 
class SubSystemThree
{
public:
	void MethodThree(){ std::cout << "SubSystem 3" << std::endl; }
};


// Facade
class Facade
{
public:
	Facade()
	{
		pOne = new SubSystemOne();
		pTwo = new SubSystemTwo();
		pThree = new SubSystemThree();
	}

	void MethodA()
	{
		std::cout << "Facade::MethodA" << std::endl;
		pOne->MethodOne();
		pTwo->MethodTwo();
	}

	void MethodB()
	{
		std::cout << "Facade::MethodB" << std::endl;
		pTwo->MethodTwo();
		pThree->MethodThree();
	}

private:
	SubSystemOne *pOne;
	SubSystemTwo *pTwo;
	SubSystemThree *pThree;
};

int main()
{
	Facade *pFacade = new Facade();

	pFacade->MethodA();
	pFacade->MethodB();

	return 0;
}



<think> 我们来实现一个外观模式(Facade Pattern)的例子。外观模式为复杂的子系统提供一个统一的接口,使得子系统更容易被使用。 场景:假设我们有一个家庭影院系统,包含多个设备(如DVD播放器、投影仪、音响等)。我们通过一个外观类(HomeTheaterFacade)来简化操作,实现“一键观影”功能。 子系统类: - DVDPlayer:控制DVD播放器 - Projector:控制投影仪 - SoundSystem:控制音响系统 外观类:HomeTheaterFacade,提供简单的方法如watchMovie()和endMovie() </think> 以下是一个使用C++实现的**外观模式(Facade Pattern)** 的完整示例。外观模式通过提供一个统一的接口来简化复杂子系统的使用,隐藏系统的复杂性。 ### 场景描述 假设我们有一个**家庭影院系统**包含多个组件:投影仪、音响系统和蓝光播放器。外观模式创建一个"家庭影院外观"类,提供简单的操作接口(如"看电影"),隐藏内部的复杂操作流程。 ```cpp #include <iostream> #include <string> // ================= 子系统组件 ================= // 投影仪类 class Projector { public: void on() { std::cout << "投影仪已开启\n"; } void off() { std::cout << "投影仪已关闭\n"; } void setInput(const std::string& source) { std::cout << "投影仪输入源设置为: " << source << "\n"; } }; // 音响系统类 class SoundSystem { public: void on() { std::cout << "音响系统已开启\n"; } void off() { std::cout << "音响系统已关闭\n"; } void setVolume(int level) { std::cout << "音量设置为: " << level << "%\n"; } }; // 蓝光播放器类 class BluRayPlayer { public: void on() { std::cout << "蓝光播放器已开启\n"; } void off() { std::cout << "蓝光播放器已关闭\n"; } void play(const std::string& movie) { std::cout << "开始播放电影: 《" << movie << "》\n"; } }; // ================= 外观类(简化接口) ================= class HomeTheaterFacade { private: Projector projector; SoundSystem soundSystem; BluRayPlayer bluRayPlayer; public: // 一键看电影功能 void watchMovie(const std::string& movie) { std::cout << "\n===== 准备观影 =====\n"; projector.on(); projector.setInput("HDMI1"); soundSystem.on(); soundSystem.setVolume(60); bluRayPlayer.on(); bluRayPlayer.play(movie); std::cout << "===================\n"; } // 一键结束观影 void endMovie() { std::cout << "\n===== 结束观影 =====\n"; bluRayPlayer.off(); projector.off(); soundSystem.off(); std::cout << "===================\n"; } }; // ================= 客户端代码 ================= int main() { // 创建外观对象 HomeTheaterFacade homeTheater; // 客户端只需调用简单接口 homeTheater.watchMovie("星际穿越"); homeTheater.endMovie(); return 0; } ``` ### 输出结果 ``` ===== 准备观影 ===== 投影仪已开启 投影仪输入源设置为: HDMI1 音响系统已开启 音量设置为: 60% 蓝光播放器已开启 开始播放电影: 《星际穿越》 =================== ===== 结束观影 ===== 蓝光播放器已关闭 投影仪已关闭 音响系统已关闭 =================== ``` ### 模式解析 1. **子系统组件**: - `Projector`:投影仪控制 - `SoundSystem`:音响系统控制 - `BluRayPlayer`:蓝光播放器控制 2. **外观类**:`HomeTheaterFacade` - 封装了所有子系统的复杂操作 - 提供两个简单接口:`watchMovie()`和`endMovie()` - 客户端无需了解子系统的内部细节 ### 外观模式优势 1. **简化接口**:将复杂操作封装为简单方法 2. **解耦**:客户端与子系统组件解耦 3. **复用性**:可复用外观类而无需修改客户端代码 4. **可维护性**:修改子系统不影响客户端 ### 适用场景 1. 复杂系统需要提供简单入口点 2. 分层系统中为每层提供统一接口 3. 需要解耦客户端与复杂子系统 4. 遗留系统封装和重构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值