即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

Proxy classes

编程语言 unknow_cdc 10℃ 0评论
本文目录
[隐藏]

今天在翻看More Efficitive C++偶然翻到代理类,那就总结一下所学所得。

1.代理模式

在某些应用场合原始类不能提供某些接口,此时可以通过一个称之为“代理”的第三者来实现 间接引用。通过引入一个新的对象实现对真实对象的操作或者将新的对 象作为真实对象的一个替身,这种实现机制即 为代理模式,通过引入代理对象来间接访问一 个对象,这就是代理模式的模式动机。

1.1.模式结构

Subject: 抽象主题角色


Proxy: 代理主题角色


RealSubject: 真实主题角色


代理模式

1.2.代码实现

//主线程
#include 
#include "RealSubject.h"
#include "Proxy.h"

using namespace std;

int main(int argc, char *argv[])
{
    Proxy proxy;
    proxy.request();

    return 0;
}
//Proxy.h
#ifndef PROXY_H_
#define PROXY_H_

#include "RealSubject.h"
#include "Subject.h"

class Proxy : public Subject{
public:
    Proxy();
    virtual ~Proxy();
    void request();

private:
    void afterRequest();
    void preRequest();  
    RealSubject *m_pRealSubject;

};
#endif
//Proxy.cpp
#include "Proxy.h"
#include 
using namespace std;

Proxy::Proxy(){
    //有人觉得 RealSubject对象的创建应该是在main中实现;我认为RealSubject应该
    //对用户是透明的,用户所面对的接口都是通过代理的;这样才是真正的代理; 
    m_pRealSubject = new RealSubject();
}

Proxy::~Proxy(){
    delete m_pRealSubject;
}

void Proxy::afterRequest(){
    cout << "Proxy::afterRequest" << endl;
}

void Proxy::preRequest(){
    cout << "Proxy::preRequest" << endl;
}

void Proxy::request(){
    preRequest();
    m_pRealSubject->request();
    afterRequest();
}

1.3.模式分析

1.3.1.代理模式的优点

  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系 统的耦合度
  • 远程代理使得客户端可以访问在远程机器上的对象,远程机器 可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求
  • 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系 统资源的消耗,对系统进行优化并提高运行速度
  • 保护代理可以控制对真实对象的使用权限

1.3.2.代理模式的缺点

  • 由于增加了代理对象,因此增加了代理类构造析构的系统开销
  • 实现代理模式需要额外的工作,有些代理模式的实现 非常复杂

2.代理类

再来说说代理类在More Efficitive C++条款30中有提到过要想实现类的二位数组甚至n维数组,若要以常规方式实现就只能使用看起来像函数调用的实现方式就像date(3, 6) //3*6的二维数组。c++中没有提供[][]运算符的重载,所以也无法利用重载来实现date[3][6] 的操作。此时代理类出场了,我们知道不论是二维数组还是n维数组都可以理解为多个一维数组或多个n-1维数组,所以我们可以使用内嵌代理类的方式来间接的调用类内重载的[]运算符。

template
class Array2D{
public:
    class Array1D{
    public:
        T& operator[](int index);
        const t& operator[](int index) const;
    };

    Array1D operator[](int index);
    const Array1D operator[](int index) const;
};

可以看到Array2D类内的代理类Array1D并不表现给客户使用,他们的工作仅是接管对Array2D的[][]运算符操作,这就是代理类的实现目标。还有诸如左值/右值的区分,压抑隐式转换也都用到代理类,具体细节可以参考书中内容。

参考链接

转载请注明:CodingBlog » Proxy classes

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情