门面模式(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模式中组件的内部应该是"相互耦合关系比较大的一系列组件",而不是一个简单的功能集合。
相关推荐
白曦20 分钟前
switch语句的使用
c++
饕餮怪程序猿1 小时前
C++:大型语言模型与智能系统底座的隐形引擎
c++·人工智能
程序员龙一1 小时前
C++之lambda表达式使用解读
c++·lambda
散峰而望1 小时前
C++入门(二) (算法竞赛)
开发语言·c++·算法·github
-指短琴长-2 小时前
ProtoBuf速成【基于C++讲解】
android·java·c++
Cx330❀2 小时前
《C++ 搜索二叉树》深入理解 C++ 搜索二叉树:特性、实现与应用
java·开发语言·数据结构·c++·算法·面试
不染尘.2 小时前
2025_11_5_刷题
开发语言·c++·vscode·算法·贪心算法·动态规划
2501_929177582 小时前
C++中的虚基类
开发语言·c++·算法
QT 小鲜肉3 小时前
【QT/C++】Qt网络编程进阶:TCP网络编程的基本原理和实际应用(超详细)
c语言·开发语言·网络·c++·qt·学习·tcp/ip
艾莉丝努力练剑3 小时前
【C++:map和set的使用】C++ map/multimap完全指南:从红黑树原理入门到高频算法实战
大数据·开发语言·c++·人工智能·stl·map