门面模式(C++)

定义

为子系统中的一组接口提供一个一致(稳定) 的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。

应用场景

  • 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。
  • 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?

结构

代码示例

cpp 复制代码
//Facade.h
/****************************************************/
#ifndef FACADE_H
#define FACADE_H
#include <iostream>
#include <list>
#include <vector>
#include <string>
 
using namespace std;
 
// 厨师
class Cook
{
public:
	// 炒菜
	void cookMeal(vector<string> menu) {
		for (int i = 0; i < menu.size(); ++i) {
			cout << "正在炒:" << menu[i] << endl;
		}
	}
};
 
// 服务员
class Waiter
{
public:
	// 点菜
	void orderDishes(vector<string> menu) {
		for (int i = 0; i < menu.size(); ++i) {
			cout << "点菜:" << menu[i] << endl;
		}
	}
 
	// 收拾
	void clear() {
		cout << "打扫卫生。" << endl;
	}
 
};
 
// 前台
class Reception
{
public:
	// 欢迎
	void welcome() {
		cout << "欢迎光临!" << endl;
	}
 
	// 买单
	void bill() {
		cout << "买单完成,欢迎下次再来!" << endl;
	}
 
};
 
// 门面
class Facade
{
public:
	// 构造函数
	Facade() {
		m_cook = new Cook();
		m_waiter = new Waiter();
		m_reception = new Reception();
	}
 
	// 析构函数
	~Facade() {
		if (m_cook != nullptr) {
			delete m_cook;
			m_cook = nullptr;
		}
		if (m_waiter != nullptr) {
			delete m_waiter;
			m_waiter = nullptr;
		}
		if (m_reception != nullptr) {
			delete m_reception;
			m_reception = nullptr;
		}
	}
 
	// 经营
	void manage(vector<string> menu) {
		// 欢迎
		m_reception->welcome();
 
		// 服务员点菜
		m_waiter->orderDishes(menu);
 
		// 厨师炒菜
		m_cook->cookMeal(menu);
 
		// 客人用餐
		cout << "客人用餐中。" << endl;
 
		// 买单
		m_reception->bill();
 
		// 打扫卫生
		m_waiter->clear();
	}
 
private:
	Cook *m_cook;
	Waiter *m_waiter;
	Reception *m_reception;
};


#endif
cpp 复制代码
//test.cpp
/****************************************************/
#include "Facade.h"
int main()
{
	Facade *facade = new Facade();
	// 餐馆运营
	vector<string> menu = { "红烧肉","土豆丝","酸菜鱼" };
	facade->manage(menu);
	delete facade;
	facade = nullptr;
	
	return 0;
}

运行结果

要点总结

  • 从客户程序的角度来看,Facade模式简化 了整个组件系统的接口,对于组件内部与外部客户程序来说,达到了一-种" 解耦 "的效果------内部子系统的任何变化不会影响到Facade接口的变化。
  • Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。
  • Facade设计模式并非一个集装箱,可以任意地放进任何多个对象。Facade模式中组件的内部应该是"相互耦合关系比较大的一系列组件",而不是一个简单的功能集合。
相关推荐
智者知已应修善业1 小时前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法
Trouvaille ~1 小时前
【Linux】应用层协议设计实战(一):自定义协议与网络计算器
linux·运维·服务器·网络·c++·http·应用层协议
CSCN新手听安1 小时前
【linux】高级IO,I/O多路转接之poll,接口和原理讲解,poll版本的TCP服务器
linux·运维·服务器·c++·计算机网络·高级io·poll
CSCN新手听安1 小时前
【linux】网络基础(三)TCP服务端网络版本计算器的优化,Json的使用,服务器守护进程化daemon,重谈OSI七层模型
linux·服务器·网络·c++·tcp/ip·json
m0_736919101 小时前
C++中的委托构造函数
开发语言·c++·算法
小小小小王王王2 小时前
洛谷-P1886 【模板】单调队列 / 滑动窗口
c++·算法
历程里程碑2 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Sheep Shaun2 小时前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制
小龙报2 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
石去皿3 小时前
【嵌入式就业6】计算机组成原理与操作系统核心机制:夯实底层基础
c++·面试·嵌入式