美文网首页
代理模式

代理模式

作者: 扎Zn了老Fe | 来源:发表于2017-09-03 16:39 被阅读0次

    大话设计模式里面的例子:
    小王想追求小娟,但他不认识小娟。但他的朋友小林认识小娟,所以他通过让小林帮忙送礼物的方式追求小娟。

    这里的小林就是我们的代理!

    代理模式的目的是: 隐藏真实访问对象,同时可以处理别的事情

    定义
    代理模式:为其他对象提供一种代理以控制对这个对象的访问
    也就是说,代理是一个中介, 它连接客户端和目标对象,同时可以附加对种用途

    模式结构

    Paste_Image.png

    例子:

    class Girl {
    public:
        Girl(char* name = ""):mName(name){}
        char* getName()  {
            return mName;
        }
    private:
        char* mName;
    };
    
    class GiveGift {
    public:
        virtual void GiveDolls() = 0;
        virtual void GiveFlowers() = 0;
        virtual void GiveChocolate() = 0;
    };
    
    class Puisuit : public GiveGift {
    public:
        Puisuit(Girl mm):mGirl(mm){}
    
        virtual void GiveDolls()  {
            cout<<"送"<<mGirl.getName()<<"玩具!"<<endl;
        }
    
        virtual void GiveFlowers() {
            cout<<"送"<<mGirl.getName()<<"鲜花!"<<endl;
        }
    
        virtual void GiveChocolate()  {
            cout<<"送"<<mGirl.getName()<<"巧克力!"<<endl;
        }
    private:
        Girl mGirl;
    
    };
    
    class Proxy : public GiveGift {
    public:
        Proxy(Girl mm)  {
            mPuisuit = new Puisuit(mm);
        }
    
        virtual void GiveDolls()  {
            mPuisuit->GiveDolls();
        }
    
        virtual void GiveFlowers()  {
            mPuisuit->GiveFlowers();
        }
    
        virtual void GiveChocolate()  {
            mPuisuit->GiveChocolate();
        }
    private:
        Puisuit* mPuisuit;
    
    };
    
    #include <iostream>
    #include "Proxy.h"
    
    using namespace std;
    
    int main() {
        Girl mm("小娟");
        Proxy pro(mm);
        pro.GiveChocolate();
        pro.GiveDolls();
        pro.GiveFlowers();
    
        return 0;
    }
    

    优点:

    在不改变原有代码的情况下,把类的核心功能和装饰功能区分开了,并能动态扩展一个对象的新功能
    缺点:

    对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

    相关文章

      网友评论

          本文标题:代理模式

          本文链接:https://www.haomeiwen.com/subject/upkjjxtx.html