C++设计模式-Facade模式
Facade模式
作用:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
动机
将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。
达到该目标的途径之一是就是引入一个外观(Facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。
将各个子系统整合起来作为Facade,提供给客户端使用。
适用性
1.当你要为一个复杂子系统提供一个简单接口时。
2.客户程序与抽象类的实现部分之间存在着很大的依赖性。
3.当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。仅通过facade进行通讯。
UML图如下:
Facade:
知道哪些子系统类负责处理请求。
将客户的请求代理给适当的子系统对象。
Subsystem classes :
实现子系统的功能。
处理由Facade对象指派的任务。
没有facade的任何相关信息;即没有指向facade的指针。
客户程序通过发送请求给Facade的方式与子系统通讯, Facade将这些消息转发给适当的子系统对象。
尽管是子系统中的有关对象在做实际工作,但Facade模式本身也必须将它的接口转换成子系统的接口。
Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。
Facade模式可以消除复杂的循环依赖关系。降低客户-子系统之间的耦合度。
使用Facade的客户程序不需要直接访问子系统对象。
代码如下:
Facade.h
1 #ifndef _FACADE_H_ 2 #define _FACADE_H_ 3 4 class Subsystem1 5 { 6 public: 7 Subsystem1(); 8 ~Subsystem1(); 9 void Operation(); 10 }; 11 12 class Subsystem2 13 { 14 public: 15 Subsystem2(); 16 ~Subsystem2(); 17 void Operation(); 18 }; 19 20 class Facade 21 { 22 public: 23 Facade(); 24 ~Facade(); 25 void OperationWrapper(); 26 private: 27 Subsystem1* _subsys1; 28 Subsystem2* _subsys2; 29 }; 30 31 #endif
Facade.cpp
1 #include "Facade.h" 2 #include <iostream> 3 4 using namespace std; 5 6 Subsystem1::Subsystem1() 7 {} 8 9 Subsystem1::~Subsystem1() 10 {} 11 12 void Subsystem1::Operation() 13 { 14 cout << "Subsystem1::Operation" << endl; 15 } 16 17 Subsystem2::Subsystem2() 18 {} 19 20 Subsystem2::~Subsystem2() 21 {} 22 23 void Subsystem2::Operation() 24 { 25 cout << "Subsystem2::Operation" << endl; 26 } 27 28 Facade::Facade() 29 { 30 this->_subsys1 = new Subsystem1(); 31 this->_subsys2 = new Subsystem2(); 32 } 33 34 Facade::~Facade() 35 { 36 delete this->_subsys1; 37 delete this->_subsys2; 38 39 this->_subsys1 = NULL; 40 this->_subsys2 = NULL; 41 } 42 43 void Facade::OperationWrapper() 44 { 45 this->_subsys1->Operation(); 46 this->_subsys2->Operation(); 47 }
main.cpp
1 #include "Facade.h" 2 3 int main() 4 { 5 Facade* pFacade = new Facade(); 6 pFacade->OperationWrapper(); 7 return 0; 8 }
另一个例子,转自http://www.cnblogs.com/bastard/archive/2012/02/03/2336706.html:
1 subsystemClasses
以三种信息:SMS,MMS,PUSH为例:checkReady,getContent
1 /*----------------------------------------------------------------*/ 2 /* class Base */ 3 /*----------------------------------------------------------------*/ 4 class Base 5 { 6 public: 7 Base(){}; 8 };
1 /*----------------------------------------------------------------*/ 2 /* class SmsUtil */ 3 /*----------------------------------------------------------------*/ 4 class SmsUtil: public Base 5 { 6 #define SMS_CONTENT "I am sms content" 7 public: 8 SmsUtil(){} 9 bool checkReady() 10 { 11 cout<<"SmsUtil checkReady"<<endl; 12 return true; 13 } 14 bool getSmsContent(int msg_id,char* pContent) 15 { 16 cout<<"SmsUtil getSmsContent"<<endl; 17 strcpy(pContent,SMS_CONTENT); 18 return true; 19 } 20 }; 21 22 /*----------------------------------------------------------------*/ 23 /* class MmsUtil */ 24 /*----------------------------------------------------------------*/ 25 class MmsUtil: public Base 26 { 27 #define MMS_CONTENT "I am mms content" 28 public: 29 MmsUtil(){} 30 bool checkReady() 31 { 32 cout<<"MmsUtil checkReady"<<endl; 33 return true; 34 } 35 bool getMmsContent(int msg_id,char* pContent) 36 { 37 cout<<"MmsUtil getMmsContent"<<endl; 38 strcpy(pContent,MMS_CONTENT); 39 return true; 40 } 41 }; 42 43 /*----------------------------------------------------------------*/ 44 /* class PushUtil */ 45 /*----------------------------------------------------------------*/ 46 class PushUtil: public Base 47 { 48 #define PUSH_CONTENT "I am push content" 49 public: 50 PushUtil(){} 51 bool checkReady() 52 { 53 cout<<"PushUtil checkReady"<<endl; 54 return true; 55 } 56 bool getPushContent(int msg_id,char* pContent) 57 { 58 cout<<"PushUtil getPushContent"<<endl; 59 strcpy(pContent,PUSH_CONTENT); 60 return true; 61 } 62 };
2 Facade ——单例类
1 /*----------------------------------------------------------------*/ 2 /* class MsgFacade */ 3 /*----------------------------------------------------------------*/ 4 enum MsgType 5 { 6 SMS, 7 MMS, 8 PUSH, 9 MSG_ALL 10 }; 11 12 class MsgFacade: public Base 13 { 14 protected: 15 MsgFacade() 16 { 17 m_sms = new SmsUtil(); 18 m_mms = new MmsUtil(); 19 m_push = new PushUtil(); 20 } 21 public: 22 static MsgFacade* getInstance() 23 { 24 if (s_instance == NULL) 25 { 26 s_instance = new MsgFacade(); 27 } 28 29 return s_instance; 30 } 31 static void closeInstance() 32 { 33 delete s_instance; 34 } 35 public: 36 bool checkReady(int type) 37 { 38 bool resutl = false; 39 40 resutl = m_sms->checkReady(); 41 resutl &= m_mms->checkReady(); 42 resutl &= m_push->checkReady(); 43 44 return resutl; 45 } 46 bool getMsgContent(int type,int msg_id,char* pContent) 47 { 48 switch(type) 49 { 50 case SMS: 51 { 52 m_sms->getSmsContent(msg_id,pContent); 53 break; 54 } 55 case MMS: 56 { 57 m_mms->getMmsContent(msg_id,pContent); 58 break; 59 } 60 case PUSH: 61 { 62 m_push->getPushContent(msg_id,pContent); 63 break; 64 } 65 default: 66 break; 67 } 68 69 return true; 70 } 71 private: 72 SmsUtil* m_sms; 73 MmsUtil* m_mms; 74 PushUtil* m_push; 75 76 static MsgFacade* s_instance; 77 }; 78 MsgFacade* MsgFacade::s_instance = NULL;
3 Test
1 #include "facade.h" 2 3 int main() 4 { 5 MsgFacade* msg = MsgFacade::getInstance(); 6 msg->checkReady(MSG_ALL); 7 8 cout<<endl; 9 char content[100] = {0}; 10 11 msg->getMsgContent(SMS,0,content); 12 cout<<content<<endl; 13 14 msg->getMsgContent(MMS,0,content); 15 cout<<content<<endl; 16 17 msg->getMsgContent(PUSH,0,content); 18 cout<<content<<endl; 19 20 return 0; 21 }
4 Result
SmsUtil checkReady MmsUtil checkReady PushUtil checkReadySmsUtil getSmsContent I am sms content MmsUtil getMmsContent I am mms content PushUtil getPushContent I am push content
仅需要一个Facade对象,因此Facade对象通常属于Singleton 模式
C++设计模式-Facade模式相关推荐
- 重学设计模式 - Facade模式
1. Facade模式简介 Façade在建筑领域的意思是:(掩饰真相的)门面,也就意味着,如果你想探究更细节的真相就需要经过Façade. <设计模式>一书中对Façade模式的 ...
- GOF 设计模式Facade模式 笔记
Facade(外观) 意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构图 在以下情况使用: 当你要为一个复杂子系统提供一个简 ...
- 设计模式-Facade模式
门面(Facade)模式的理解与应用 概念 门面模式,指子系统的外部与其内部的通信必需通过一个统一的门面(Facade)对象进行,示意图如下: 应用场景 为一个复杂子系统提供一个简单接口 子系统常常因 ...
- 设计模式--门面(Facade)模式
模式定义 为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用(复用) 类图 应用场景 1.当你需要使用复杂子系统的有限但直接的接口时 ...
- facade java_Java设计模式之Facade模式
Java设计模式之Facade模式 GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易 ...
- 设计模式学习笔记——外观(Facade)模式
设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...
- Java设计模式 -11- 外观模式(Facade模式)
Java设计模式 -11- 外观模式(Facade模式) 前言 外观模式的定义与特点 优点: 缺点: 外观模式的结构与实现 1. 模式的结构 2. 模式的实现 外观模式的应用实例 外观模式的应用场景 ...
- PHP设计模式 - 门面模式(Facade)通俗易懂 / 友好示例代码
前言 门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面.门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与门面角色交互,用户 ...
- C++设计模式——门面模式(facade pattern)
一.原理讲解 门面模式也叫做外观模式,实质就是一个封装接口,通常是将一类功能或者一个层次功能用一个函数封装起来,供客户端统一调用. 1.1意图 为子系统中的一组接口提供一个一致的界面,Facade模式 ...
最新文章
- iOS学习之Socket使用简明教程- AsyncSocket
- Android非空格式验证框架Validation的使用---第三方库学习笔记(四)
- UNIX系统编程(一)
- #python#练习
- 整数序列(牛客,线段树)
- Cisco 3550-EMI 交 换 机 配 置 教 程
- 解决mapgis比例尺不正确问题
- 前端那些事之原生 js实现贪吃蛇篇
- django-模板文件加载顺序
- 《4月份数据库技术通讯》.pdf
- springboot filter_SpringBoot(二) :web综合开发
- python去除行末符EOL的一般方法
- android经典的消费生产模式,生产消费者模式与Handler
- 四种常见排序算法----php代码实现
- java从入门到精通一(java开发入门)
- web网页设计实例作业 ——校园文化(7页) html大学生网站开发实践作业
- matlab 多项式输入,MATLAB多项式
- 【统计学】相关性和因果关系
- python3自动发送邮件并添加附件
- 在线安装rancher2.4管理K8S集群并部署服务
热门文章
- el table 固定表头和首行_表头太太太复杂了,如何批量打印?简单!
- 苹果电脑连服务器传文件慢,两个mac之间快速传递文件
- Cell Reports:CRISPR-Cas12k引导的细菌普适性靶向遗传筛选系统
- R语言可视化学习笔记之ggridges包绘制山峦图
- Python 刷题常用语法与数据结构汇总-2022.01.30
- 产品经理职业发展前景的剖析
- css怎样设置li分栏,css怎么对文字分栏
- 两个构件的重合点_GTJ2018软件中如何合并两个工程?
- 基于java的科研信息管理平台
- Web前端笔记-画布拖动及放缩(two.js)