Facade模式
一 意图
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
二 动机
将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。
达到该目标的途径之一是就是引入一个外观(Facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。
将各个子系统整合起来作为Facade,提供给客户端使用。
看下面这样一个系统:
转变成:
三 适用性及其结构
- 当你要为一个复杂子系统提供一个简单接口时。
- 客户程序与抽象类的实现部分之间存在着很大的依赖性。
- 当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。仅通过facade进行通讯。
结构:
Facede:
知道哪些子系统类负责处理请求。
将客户的请求代理给适当的子系统对象。
Subsystem classes :
实现子系统的功能。
处理由Facade对象指派的任务。
没有facade的任何相关信息;即没有指向facade的指针。
客户程序通过发送请求给Facade的方式与子系统通讯, Facade将这些消息转发给适当的子系统对象。
尽管是子系统中的有关对象在做实际工作,但Facade模式本身也必须将它的接口转换成子系统的接口。
Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。
Facade模式可以消除复杂的循环依赖关系。降低客户-子系统之间的耦合度。
使用Facade的客户程序不需要直接访问子系统对象。
四 代码实现
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[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 checkReadyMmsUtil checkReadyPushUtil checkReady SmsUtil getSmsContentI am sms contentMmsUtil getMmsContentI am mms contentPushUtil getPushContentI am push content
仅需要一个Facade对象,因此Facade对象通常属于Singleton 模式
时间: 2024-10-10 05:40:03