外观/门面模式(Facade)
2015/4/28
外观/门面模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
#include <vector>
#include <iostream>
using namespace std;
class Base{
public:
virtual void Product()=0;
};
class ProductA:public Base{
public:
void Product()
{
cout<<"A"<<endl;
}
};
class ProductB:public Base{
public:
void Product()
{
cout<<"B"<<endl;
}
};
class ProductC:public Base{
public:
void Product()
{
cout<<"C"<<endl;
}
};
template <typename T>class Facade{
private:
vector <T> vec;
public:
void Add(T t)
{
vec.push_back(t);
}
/*可以定义多个函数实现不同的遍历顺序在此处我们是如何进入就如何输出,类似于队列*/
void Product()
{
vector <T>::iterator it;//typename
for(it=vec.begin();it!=vec.end();it++)
(*it)->Product();
}
};
int main(void)
{
Base *pa=new ProductA();
Base *pb=new ProductB();
Base *pc=new ProductC();
/*以下是外观模式核心*/
Facade <Base *> p;
p.Add(pa);
p.Add(pb);
p.Add(pc);
p.Product();
return 0;
}
何时使用外观模式(摘自大话设计模式):
首先,在设计初期阶段,应该要有意识的将不同的两个层分离。
其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大所属的模式使用时也都会产生很多很小的类,这本是好事,也给外部调用带来了巨大的困难,增加外观Façade可以提供一个简单的接口,减少它们之间的依赖。(可以理解成将非常复杂的各种模式打包起来,我们只需要提供借口)
第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它暴汗非常重要的功能,新的需求开发必须要依赖于他,那么可以外新系统开发一个外观类Façade,让新系统与Façade交互。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异