C++设计模式结构型之代理模式

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


一、概述
    代理模式是一种结构型模式在很多不同的场合具有广泛的分类和应用。其主要实现的思想是在客户端和真正要访问的对象之间引入一个
代理对象间接层于是以往客户端对真正对象的访问现在变成了通过代理对象进行访问代理对象在这里起到了一个中介或者桥梁作用。
引入代理对象的目的主要是可以为客户端增加额外的功能、约束或者针对客户端的调用屏蔽一些复杂的细节问题。

二、基本概念与示例
    代理模式的实质是通过引入一个代理类来为原始类被代理类增加额外的能力这些额外的能力可能是指一些新功能、新服务也可能
是一些约束或者限制等。那么现在试着考虑一个例子通过浏览器访问某个网站最简单的方式就是在浏览器中输入网站的地址来直接访问。

class CWebAddr
{
public:
    virtual void visit() = 0;
    virtual ~CWebAddr(){}
};

class CWebAddr_Shopping : public CWebAddr
{
public:
    virtual void visit()
    {
        //访问购物网站复杂通信逻辑
        cout << "访问CWebAddr_Shopping购物网站" << endl;
    }
};

class CWebAddr_Video : public CWebAddr
{
public:
    virtual void visit()
    {
        //访问视频网站复杂通信逻辑
        cout << "访问CWebAddr_Video视频网站" << endl;
    }
};

//主函数
int main()
{
    CWebAddr *pShopping = new CWebAddr_Shopping();
    pShopping->visit();
    
    CWebAddr *pVideo = new CWebAddr_Video();
    pVideo->visit();
    
    delete pShopping;
    delete pVideo;
    
    return 0;
}

上述代码执行结果没问题描述主要是直接访问某个或者某些网站那么我们也可以引入代理类帮助我们访问这些网站
针对以上代码做出调整
class CWebAddrProxy : public CWebAddr
{
public:
    CWebAddrProxy(CWebAddr* pWebAddr) : m_webAddr(pWebAddr){}
    
public:
    virtual void visit()
    {    
        m_webAddr->visit();
    }
private:
    CWebAddr* m_webAddr;    
};

//主函数
int main()
{
    CWebAddr *pShopping = new CWebAddr_Shopping();
    CWebAddr *pVideo = new CWebAddr_Video();
    
    CWebAddrProxy *pWebproxy1 = new CWebAddrProxy(pShopping);
    pWebproxy1->visit();
    
    CWebAddrProxy *pWebproxy2 = new CWebAddrProxy(pVideo);
    pWebproxy2->visit();
        
    delete pShopping;
    delete pVideo;
    delete pWebproxy1;
    delete pWebproxy2;
    
    return 0;
}

三、代理模式定义与角色
    引入代理模式的定义为其他对象提供一种代理以控制对这个对象的访问。代理模式通过创建代理对象来代表真实对象客户端操作代理
对象与操作真实对象并没有什么不同。当然最核心、最本质的功能最终还是需要代理对象操纵真实对象来完成。
代理模式UML图中涉及三个角色
1Subject抽象对象。该类定义真实主题与代理主题的共同接口这样在真实主题的地方都可以使用代理主题。
2Proxy(代理主题)。该类内部包含了对真实主题的引用从而可以对真实主题进行访问。代理主题中一般会提供与真实主题相同的接口以
达到可以取代真实主题的目的。同时也可以对真实主题的访问进行约束和限制也能够控制必要时的创建/删除真实主题。
3RealSubject真实主题定义代理主题代表的真实对象真正的业务是在真实主题中实现的客户端通过代理主题间接访问真实主题中的
接口。

四、代理模式的应用场合
    代理模式UML图分厂简单总结起来也简单----在软件设计中增加间接层来获取更大的灵活性和增加更多的控制。在实际中代理模式可能
会在许多场合得到应用并且其实现可能会非常复杂。
1远程代理
2虚拟代理
3保护代理
4缓存/缓冲代理
5智能引用代理
6写时复制优化代理

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: c++