• Facade模式——设计模式学习笔记


    Facade模式

    一 意图

      为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

    二 动机

      将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。

    达到该目标的途径之一是就是引入一个外观(Facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。

    将各个子系统整合起来作为Facade,提供给客户端使用。

      看下面这样一个系统:

      

        

      转变成:

      

        

    三 适用性及其结构

    1. 当你要为一个复杂子系统提供一个简单接口时。
    2. 客户程序与抽象类的实现部分之间存在着很大的依赖性。
    3. 当你需要构建一个层次结构的子系统时,使用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;
    }
    };


    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 模式



  • 相关阅读:
    Django跨域问题
    DOM,jquery,vue
    from和modelform的用法和介绍
    元类的__call__和__new__方法的作用
    Django学习之路由分发和反向解析
    Django 自定义auth_user
    Django创建对象的create和save方法
    Flask--(登录注册)抽取视图函数
    Flask--(项目准备)--添加日志
    Flask--(项目准备)--框架搭建,配置文件抽取,业务逻辑抽取
  • 原文地址:https://www.cnblogs.com/bastard/p/2336706.html
Copyright © 2020-2023  润新知