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模式可以为相互关联在一起的错综复杂的类整理出高层接口,可以让系统对外只有一个简单的接口,而且还会考虑到系统内部各个类之间的责任关系和依赖关系,按照正常的顺序调用各个类. 还是先看一下示例程 ...
随机推荐
- 转载《Android LayoutInflater详解》
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- 学习 Local Sensitive Hash
1. 最近邻法的应用 1.1 Jaccard 相似集 如何定义相似:即相关属性交集的大小,越大则越相似.我们给相似一个数学上的定义:Jaccard 相似集. 集合 \(S\) 与集合 \(T\) 的 ...
- leetcode 179. Largest Number 求最大组合数 ---------- java
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- underscore.extend.js
/** * 基于underscore的扩展 * @module lib/underscoreExtend */ (function() { // 全局可能用到的变量 var arr = []; var ...
- 在树莓派上使用no-ip动态域名的方法,也适用其它Linux平台
注意,如果没有公网IP,本文的方法就不可行了. 首先,注册一个noip.com的帐号. 注册的步骤见这篇教程:http://www.cnblogs.com/infopi/p/3991407.html ...
- 如何对web.config进行加密和解密
http://blog.csdn.net/jf_jifei/article/details/6527390 在WEB网站开发过程中,如果我们将数据库连接字符串封装到.DLL文件中,将会给数据库和程序的 ...
- Docker 官网信息
Docker Engine Docker-for-linuxhttps://docs.docker.com/engine/installation/linux/rhel/https://docs.do ...
- C#固定时间执行指定事件(观察者模式+异步委托)
最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指 ...
- Zookeeper基本配置
前面两篇文章介绍了Zookeeper是什么和可以干什么,那么接下来我们就实际的接触一下Zookeeper这个东西,看看具体如何使用,有个大体的感受,后面再描述某些地方的时候也能在大脑中有具体的印象.本 ...
- android模拟器没法通过localhost访问本地服务器的解决
当android项目访问在一台服务器上的WEB服务时,没法通过localhost或者127.0.0.1来访问.模拟器把它自己作为了localhost,代码中使用localhost或者127.0.0.1 ...