Facade模式——设计模式学习笔记
2012-02-03 10:54
183 查看
Facade模式
[b]一 意图[/b]
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
[b]二 动机[/b]
将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。
达到该目标的途径之一是就是引入一个外观(Facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。
将各个子系统整合起来作为Facade,提供给客户端使用。
看下面这样一个系统:
转变成:
[b]三 适用性及其结构[/b]
当你要为一个复杂子系统提供一个简单接口时。
客户程序与抽象类的实现部分之间存在着很大的依赖性。
当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。仅通过facade进行通讯。
结构:
Facede:
知道哪些子系统类负责处理请求。
将客户的请求代理给适当的子系统对象。
Subsystem classes :
实现子系统的功能。
处理由Facade对象指派的任务。
没有facade的任何相关信息;即没有指向facade的指针。
客户程序通过发送请求给Facade的方式与子系统通讯, Facade将这些消息转发给适当的子系统对象。
尽管是子系统中的有关对象在做实际工作,但Facade模式本身也必须将它的接口转换成子系统的接口。
Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。
Facade模式可以消除复杂的循环依赖关系。降低客户-子系统之间的耦合度。
使用Facade的客户程序不需要直接访问子系统对象。
[b]四 代码实现[/b][b] [/b]
1 subsystemClasses
[b]以三种信息:SMS,MMS,PUSH为例:checkReady,getContent[/b]
2 Facade ——单例类
3 Test
4 Result
仅需要一个Facade对象,因此Facade对象通常属于Singleton 模式
[b]一 意图[/b]
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
[b]二 动机[/b]
将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。
达到该目标的途径之一是就是引入一个外观(Facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。
将各个子系统整合起来作为Facade,提供给客户端使用。
看下面这样一个系统:
转变成:
[b]三 适用性及其结构[/b]
当你要为一个复杂子系统提供一个简单接口时。
客户程序与抽象类的实现部分之间存在着很大的依赖性。
当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。仅通过facade进行通讯。
结构:
Facede:
知道哪些子系统类负责处理请求。
将客户的请求代理给适当的子系统对象。
Subsystem classes :
实现子系统的功能。
处理由Facade对象指派的任务。
没有facade的任何相关信息;即没有指向facade的指针。
客户程序通过发送请求给Facade的方式与子系统通讯, Facade将这些消息转发给适当的子系统对象。
尽管是子系统中的有关对象在做实际工作,但Facade模式本身也必须将它的接口转换成子系统的接口。
Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。
Facade模式可以消除复杂的循环依赖关系。降低客户-子系统之间的耦合度。
使用Facade的客户程序不需要直接访问子系统对象。
[b]四 代码实现[/b][b] [/b]
1 subsystemClasses
[b]以三种信息:SMS,MMS,PUSH为例:checkReady,getContent[/b]
/*----------------------------------------------------------------*/ /* 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[100] = {0}; msg->getMsgContent(SMS,0,content); cout<<content<<endl; msg->getMsgContent(MMS,0,content); cout<<content<<endl; msg->getMsgContent(PUSH,0,content); cout<<content<<endl; return 0; }
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 模式
相关文章推荐
- 设计模式学习笔记(十一)——Facade外观模式
- Facade模式——设计模式学习笔记
- 设计模式学习笔记(十一)——Facade外观模式
- 设计模式C++学习笔记之六(Facade门面模式)
- 设计模式学习笔记(一)--Facade外观模式
- 设计模式学习笔记(十一)——Facade外观
- 【设计模式学习笔记十一】【结构型模式】【外观模式(Facade)】
- [学习笔记]设计模式之Facade
- 步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)
- [设计模式学习笔记]FACADE外观模式
- 【设计模式学习笔记】Facade
- 设计模式C++学习笔记之六(Facade门面模式)
- 设计模式学习笔记(一)--Facade外观模式
- 设计模式学习笔记十三:外观模式(Facade Pattern)
- 步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)
- 设计模式C++学习笔记之六(Facade门面模式)
- 设计模式学习笔记--门面(Facade)模式
- 设计模式学习笔记——外观(Facade)模式
- 设计模式C++学习笔记之六(Facade门面模式)
- 设计模式学习笔记(十一)——Facade外观模式