一、门面模式是什么?
门面模式是一种结构型的软件设计模式,也叫外观模式,它提供了统一的接口去访问多个子系统的接口。举个例子,一个餐馆里有许多角色,每个角色就是一个子系统,餐馆就是总系统,客人来餐馆只需要按要求点餐,不需要管餐馆是怎么运作的。
门面模式的优点:
- 简洁易使用。为复杂的模块和系统提供了一个简单的接口,简易化操作。
- 保证了子系统独立性。子系统间独立性良好,彼此间一般不受影响,如何使用由门面决定。
- 保证了系统稳定性。当直接使用子系统,可能会出现无法预知的异常时,门面模式可通过高层接口规范子系统接口的调用,且有效阻隔子系统和客户端间的交互,进而增强系统鲁棒性。
- 隐秘性好。门面将子系统的具体细节都封装了起来。
门面模式的缺点:
- 不符合开闭原则。添加新系统要对门面进行修改。
- 对开发者要求高。开发者需要了解子系统间的业务逻辑关系,这样才能确保封装的高层接口是有效且稳定的。
二、门面模式
2.1 结构图
客户端即Main主函数,门面就是个总系统,里面管理着多个子系统。
2.2 代码示例
场景描述:去餐馆吃饭。
//Facade.h /****************************************************/ #pragma once #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; };
//main.cpp /****************************************************/ #include <iostream> #include <string> #include "Facade.h" using namespace std; int main() { Facade *facade = new Facade(); // 餐馆运营 vector<string> menu = { "红烧肉","土豆丝","酸菜鱼" }; facade->manage(menu); delete facade; facade = nullptr; return 0; }
程序结果如下。
门面模式是应用比较广泛的一种设计模式,比如在一些对专业技术有要求的行业里,整个技术路线是庞大复杂且精妙的,一套技术路线中涵盖了多种子技术,这类场景下用门面模式,就能很好地实现算法库的封装。
像在我的工作中,因为我司设计的算法库往往需要涵盖几十甚至更多的功能类,各个类组合起来就能实现一些工程上的技术,若不对其进行组合封装,则调用算法库的软件工程师(不具备专业技术背景)就不知道如何使用了。而通过门面模式可以将复杂的功能封装起来,只提供一个高层接口给软件部门,软件工程师只需要按照算法给定的要求调用接口即可。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对门面模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解门面模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!