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
- #ifndef _FACADE_H_
- #define _FACADE_H_
- class Subsystem1
- {
- public:
- Subsystem1();
- ~Subsystem1();
- void Operation();
- };
- class Subsystem2
- {
- public:
- Subsystem2();
- ~Subsystem2();
- void Operation();
- };
- class Facade
- {
- public:
- Facade();
- ~Facade();
- void OperationWrapper();
- private:
- Subsystem1* _subsys1;
- Subsystem2* _subsys2;
- };
- #endif
Facade.cpp
- #include "Facade.h"
- #include <iostream>
- using namespace std;
- Subsystem1::Subsystem1()
- {}
- Subsystem1::~Subsystem1()
- {}
- void Subsystem1::Operation()
- {
- cout << "Subsystem1::Operation" << endl;
- }
- Subsystem2::Subsystem2()
- {}
- Subsystem2::~Subsystem2()
- {}
- void Subsystem2::Operation()
- {
- cout << "Subsystem2::Operation" << endl;
- }
- Facade::Facade()
- {
- this->_subsys1 = new Subsystem1();
- this->_subsys2 = new Subsystem2();
- }
- Facade::~Facade()
- {
- delete this->_subsys1;
- delete this->_subsys2;
- this->_subsys1 = NULL;
- this->_subsys2 = NULL;
- }
- void Facade::OperationWrapper()
- {
- this->_subsys1->Operation();
- this->_subsys2->Operation();
- }
main.cpp
- #include "Facade.h"
- int main()
- {
- Facade* pFacade = new Facade();
- pFacade->OperationWrapper();
- return ;
- }
另一个例子,转自http://www.cnblogs.com/bastard/archive/2012/02/03/2336706.html:
1 subsystemClasses
以三种信息:SMS,MMS,PUSH为例:checkReady,getContent
- /*----------------------------------------------------------------*/
- /* class Base */
- /*----------------------------------------------------------------*/
- class Base
- {
- public:
- Base(){};
- };
- /*----------------------------------------------------------------*/
- /* class SmsUtil */
- /*----------------------------------------------------------------*/
- class SmsUtil: public Base
- {
- #define SMS_CONTENT "I am sms content"
- public:
- SmsUtil(){}
- bool checkReady()
- {
- cout<<"SmsUtil checkReady"<<endl;
- return true;
- }
- bool getSmsContent(int msg_id,char* pContent)
- {
- cout<<"SmsUtil getSmsContent"<<endl;
- strcpy(pContent,SMS_CONTENT);
- return true;
- }
- };
- /*----------------------------------------------------------------*/
- /* class MmsUtil */
- /*----------------------------------------------------------------*/
- class MmsUtil: public Base
- {
- #define MMS_CONTENT "I am mms content"
- public:
- MmsUtil(){}
- bool checkReady()
- {
- cout<<"MmsUtil checkReady"<<endl;
- return true;
- }
- bool getMmsContent(int msg_id,char* pContent)
- {
- cout<<"MmsUtil getMmsContent"<<endl;
- strcpy(pContent,MMS_CONTENT);
- return true;
- }
- };
- /*----------------------------------------------------------------*/
- /* class PushUtil */
- /*----------------------------------------------------------------*/
- class PushUtil: public Base
- {
- #define PUSH_CONTENT "I am push content"
- public:
- PushUtil(){}
- bool checkReady()
- {
- cout<<"PushUtil checkReady"<<endl;
- return true;
- }
- bool getPushContent(int msg_id,char* pContent)
- {
- cout<<"PushUtil getPushContent"<<endl;
- strcpy(pContent,PUSH_CONTENT);
- return true;
- }
- };
2 Facade ——单例类
- /*----------------------------------------------------------------*/
- /* class MsgFacade */
- /*----------------------------------------------------------------*/
- enum MsgType
- {
- SMS,
- MMS,
- PUSH,
- MSG_ALL
- };
- class MsgFacade: public Base
- {
- protected:
- MsgFacade()
- {
- m_sms = new SmsUtil();
- m_mms = new MmsUtil();
- m_push = new PushUtil();
- }
- public:
- static MsgFacade* getInstance()
- {
- if (s_instance == NULL)
- {
- s_instance = new MsgFacade();
- }
- return s_instance;
- }
- static void closeInstance()
- {
- delete s_instance;
- }
- public:
- bool checkReady(int type)
- {
- bool resutl = false;
- resutl = m_sms->checkReady();
- resutl &= m_mms->checkReady();
- resutl &= m_push->checkReady();
- return resutl;
- }
- bool getMsgContent(int type,int msg_id,char* pContent)
- {
- switch(type)
- {
- case SMS:
- {
- m_sms->getSmsContent(msg_id,pContent);
- break;
- }
- case MMS:
- {
- m_mms->getMmsContent(msg_id,pContent);
- break;
- }
- case PUSH:
- {
- m_push->getPushContent(msg_id,pContent);
- break;
- }
- default:
- break;
- }
- return true;
- }
- private:
- SmsUtil* m_sms;
- MmsUtil* m_mms;
- PushUtil* m_push;
- static MsgFacade* s_instance;
- };
- MsgFacade* MsgFacade::s_instance = NULL;
3 Test
- #include "facade.h"
- int main()
- {
- MsgFacade* msg = MsgFacade::getInstance();
- msg->checkReady(MSG_ALL);
- cout<<endl;
- char content[] = {};
- msg->getMsgContent(SMS,,content);
- cout<<content<<endl;
- msg->getMsgContent(MMS,,content);
- cout<<content<<endl;
- msg->getMsgContent(PUSH,,content);
- cout<<content<<endl;
- return ;
- }
4 Result
- SmsUtil checkReady
- MmsUtil checkReady
- PushUtil checkReady
- SmsUtil getSmsContent
- I am sms content
- MmsUtil getMmsContent
- I am mms content
- PushUtil getPushContent
- I am push content
仅需要一个Facade对象,因此Facade对象通常属于Singleton 模式
C++设计模式-Facade模式的更多相关文章
- 设计模式--外观(Facade)模式
Insus.NET在去年有写过一篇<软件研发公司,外观设计模式(Facade)>http://www.cnblogs.com/insus/archive/2013/02/27/293606 ...
- 设计模式之Facade模式
Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用.他是为子系统中的一组接口所提供的一个一致的界面. 在遇到以下情况使用Facad ...
- 设计模式——外观模式(Facade)
1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. 例子1:一个电源总开关可以控制四盏灯 ...
- 一天学习两个设计模式之Facade模式(外观模式,结构型模式)
程序这东西随着时间推移,程序会越来越大,程序中的类越来越多,而且他们之间相互关联,这会导致程序结构变得越来越复杂.因此我们在使用他们时候,必须要弄清楚他们之间的关系才能使用他们. 特别是在调用大型程序 ...
- Java设计模式(11)外观模式(Facade模式)
外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...
- 设计模式——门面模式(Facade)
要想正确理解设计模式,首先必须明白它是为了解决什么问题而提出来的. 设计模式学习笔记 --Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1.概念 门面模式是 ...
- Facade模式——设计模式学习(转载)
Facade模式 一 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二 动机 将一个系统划分成为若干个子系统有利于降低系统的复 ...
- java的设计模式 - 外观模式(Facade)
目的 看脸模式目的很简单,就是给用户留个好印象,不想让用户关注系统中的具体细节,关注系统的外表(暴露出来的接口)就好了.一些 GUI 的菜单也好,SDK 也好或多或少也会用到这种思想.这更多的是一种思 ...
- 设计模式(十五)Facade模式
Facade模式可以为相互关联在一起的错综复杂的类整理出高层接口,可以让系统对外只有一个简单的接口,而且还会考虑到系统内部各个类之间的责任关系和依赖关系,按照正常的顺序调用各个类. 还是先看一下示例程 ...
随机推荐
- 初步认知java的方法
1.正确区分函数和方法: 面向对象的语言叫做方法,面向过程的语言叫做函数,两者的意义是一样的,只是叫法不同.java是面向对象的语言,所以用方法. 2.方法的定义: 就是有名字的代码段 3.方法的目的 ...
- 转:StrictMode使用
最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写的应用,并且提供了 ...
- music player界面
public class SoundPlayerGUI extends JFrame implements ChangeListener, ActionListener { private stati ...
- 2016 、12 、11<本周>
翻了翻记录 想把上周没搞出来的1159和day2T2搞出来.
- string.join(iterable)
str.join(iterable) Return a string which is concatenation the of the strings in the iterable iterab ...
- webpack 编译完成执行代码
接收一个项目,由于目录结构的问题,每次编译完成后就需要去修改编译后的 HTML 文件中引用的其它文件的路径. 所以想在编译完成后使用 node 来操作文件修改路径. 然后在 webpack 官网找到了 ...
- 从返回值未报错得到的对于java finally理解
不多说了,直接看图 这个代码来自<深入理解java虚拟机(第二版)>,我在eclipse中编辑的,但是没有报错,一般来说,没有返回值,eclipse都会有个提示或者报错啥的,但是这个没有, ...
- 获取贴图及IES文件
最近看了一下以前写的关于收集贴图的函数...又完善了一下,老链接:http://www.cnblogs.com/3dxy/p/3988751.html fn saveusedmaps spath se ...
- Java中的构造代码块
代码块 ----a静态代码块 ----b构造代码块 ----c普通代码块 执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. a.静态代码块: 静态代码块 ...
- Win10下SQLServer2000的安装
Win10的技术预览版已经发布近两个星期了,我也迫不及待地装上尝鲜,发现SQLServer2000在Win10上无法安装,在翻遍网上资料和经过无数次尝试后得到了一种安装方法,希望能够帮助遇到类似问题的 ...