• 设计模式学习Proxy(代理模式)


    意图:为其他对象提供一种代理以控制对这个对象的访问

    动机:为了只有在我们确实需要这个对象时才对它进行创建和初始化用一个proxy替代那个对象并在需要的时候实例化这个对象

    适用性:在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用代理(Proxy)模式

    示例图:

    imageproxy

    听众听人演讲,演讲者通过扩音器来演说,扩音器起来的了一个中间代理的作用.

    示例代码:

    //演讲者基类
    class CSpeaker
    {
    public:
        CSpeaker(void);
    public:
        ~CSpeaker(void);
        public:
        //演说接口
        virtual void Speak()=0;
    };

    //英文演说家
    class CEnglishSpeaker:public CSpeaker
    {
    public:
        CEnglishSpeaker()
        {
            //演说家初始化完毕
            _tprintf(_T("English speaker initlized/n"));
        }
        ~CEnglishSpeaker()
        {

        }
    public:
        virtual void Speak()
        {
            //演说家演说
            _tprintf(_T("The eglish speaker speak in english/n"));
        }
    };

    //扩音器代理演说家给听众发送声音
    class CLoudSpeaker:public CSpeaker
    {
    public:
        CLoudSpeaker()
        :CSpeaker(),m_pSpeaker(NULL)
        {
       
        }
        ~CLoudSpeaker()
        {
       
        }
        protected:
        //找到一个演说家
        CSpeaker* GetSpeaker()
        {
            if(m_pSpeaker == NULL)
            {
                m_pSpeaker = new CEnglishSpeaker();
            }
            return m_pSpeaker;
        }
    public:
        //演说接口
        virtual void Speak()
        {
            GetSpeaker()->Speak();       
        }
        private:
        CSpeaker* m_pSpeaker;
    };

    //听众
    class CAudience
    {
    public:
        CAudience(void);
    public:
        ~CAudience(void);
        public:
        //听众准备听某个演说家演说
        virtual void ListenTo(CSpeaker* speaker)
        {
            _tprintf(_T("Audience ready listen to speaker speaking/n"));
            m_speaker = speaker;
        }
        //开始听演说
        virtual void ListeningSpeak()
        {
            _tprintf(_T("Audience listening/n"));
            m_speaker->Speak();   
        }
        private:
        CSpeaker* m_speaker;
    };

    CLoudSpeaker* pSpeaker = new CLoudSpeaker();
        CAudience audience;
        audience.ListenTo(pSpeaker);
        audience.ListeningSpeak();

    运行结果显示只有实际开始演说是才实例化演说家对象

    res

  • 相关阅读:
    js调用后台方法
    Js 实现trim方法
    Service获取客户端IP地址(java)
    ASP.NET中页面传值
    Asp.net 实现选择文件批量下载
    js调用后台代码
    获取webservice客户端IP地址 (C# java )
    使 WebBrowser 更简单的新加和执行 js, 可安装 jQuery 脚本的 C# 开源代码 IEBrowse...
    Mac下各种网络命令的使用
    Java关键字
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2340734.html
Copyright © 2020-2023  润新知