【有毒的设计模式】代理模式

版权声明:O.O 欢迎转载,如果我有能力写到原创文章的话~ https://blog.csdn.net/qq_16468937/article/details/51027095

//说些废话

代理模式,这个是看过的几个模式中最容易理解的了,但其实我觉得应用的地方还是蛮多的,至少虚拟代理这块就可以用在很多地方了。


//部分资料来源:

1.C++设计模式(智能指引的实现):http://www.jellythink.com/archives/301

2.java实现的虚拟代理:http://blog.csdn.net/shuangde800/article/details/10324991

3.java实现的远程代理:http://www.cnblogs.com/rush/archive/2011/06/19/2084775.html

4.程杰——大话设计模式


//正文:



这个模式比较容易理解,我就举了个简单的例子,我们平时吃的黄油面包,你吃的是包,但味道是黄油的味道。

这就是面包看作一个代理,面包其中有些黄油(真实实体),然后味道是黄油提供的,他们都继承并重写了味道类的味道函数。

X个代码:

#include <QCoreApplication>
#include <iostream>
using namespace std;

class Taste
{
public:
    virtual void taste() = 0;
};

class Butter : public Taste
{
public:
    void taste()
    {
        cout<<"butter taste"<<endl;
    }
};

class Bread : public Taste
{
private:
    Butter *butter;

public:
    void taste()
    {
        if(butter == nullptr)
            butter = new Butter();
        butter->taste();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Bread *bread = new Bread();
    bread->taste();

    return a.exec();
}


代理模式有四个应用地方:

1.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实[DP]

    也就是说,你想远程访问一个网页,你在你的项目里创建了一个Web引用,当你调用它,就是调用代理的过程,然后实现了远程访问。

2.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象[DP]

    也就是说,你上饿了么订个外卖,里面有很多商家图片,你没滑到那个商家的时候,那个商家的图片要加载出来,还未加载图片的那些,就是虚拟代理了。代理存储了图片的路径和尺寸。

3.安全代理,用来控制真实对象访问时的权限[DP]

    这个找不到具体例子,我是这么理解的:你代理一个对象的时候,根据这个对象的访问权限,设置你代理允许对外表现的功能,实现安全访问。(不知道对不对)

4.智能指引,是指当调用真实的对象时,代理处理另外一些事[DP]

    这个在链接中作者有好好说了,其实就是在代理里面处理了对象引用时的计数或者其他内务问题。


再来说说代理模式和装饰模式的异同:

唔,虽然网上有很多解答,但我觉得最简单的说法就是:

同:

都存放了被调用对象的引用。

装饰模式是用装饰链去为某个对象添加功能,防止类爆炸。m装饰类:1具体类。

代理模式是针对一对一的,A帮B表现B的功能。1代理类:1具体类。(想了下好像 1代理类:n具体类  也可以,反正不是m:1)


//问题:

1.

Q:什么时候用代理模式?

A:当你想隐蔽你的具体类,当你实现加载图片,当你实现远程代理,当你想在另外一个类内处理某个对象的内务。


猜你喜欢

转载自blog.csdn.net/qq_16468937/article/details/51027095