门面模式(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 天前
算法设计与分析-算法效率分析基础-习题1.1
c语言·数据结构·c++·算法
2401_884602271 天前
程序人生-Hello’s P2P
c语言·c++
初中就开始混世的大魔王1 天前
2 Fast DDS Library概述
c++·中间件·信息与通信
娇娇yyyyyy1 天前
C++基础(6):extern解决重定义问题
c++
Neteen1 天前
【数据结构-思维导图】第二章:线性表
数据结构·c++·算法
灰色小旋风1 天前
力扣——第7题(C++)
c++·算法·leetcode
Ralph_Y1 天前
C++网络:一
开发语言·网络·c++
程序猿编码1 天前
探秘 SSL/TLS 服务密码套件检测:原理、实现与核心设计(C/C++代码实现)
c语言·网络·c++·ssl·密码套件
故事和你911 天前
sdut-程序设计基础Ⅰ-实验二选择结构(1-8)
大数据·开发语言·数据结构·c++·算法·优化·编译原理
像素猎人1 天前
数据结构之顺序表的插入+删除+查找+修改操作【主函数一步一输出,代码更加清晰直观】
数据结构·c++·算法