【有毒的设计模式】代理模式
2016-03-31 16:24
281 查看
//说些废话
代理模式,这个是看过的几个模式中最容易理解的了,但其实我觉得应用的地方还是蛮多的,至少虚拟代理这块就可以用在很多地方了。
//部分资料来源:
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个代码:
代理模式有四个应用地方:
1.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实[DP]
也就是说,你想远程访问一个网页,你在你的项目里创建了一个Web引用,当你调用它,就是调用代理的过程,然后实现了远程访问。
2.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象[DP]
也就是说,你上饿了么订个外卖,里面有很多商家图片,你没滑到那个商家的时候,那个商家的图片要加载出来,还未加载图片的那些,就是虚拟代理了。代理存储了图片的路径和尺寸。
3.安全代理,用来控制真实对象访问时的权限[DP]
这个找不到具体例子,我是这么理解的:你代理一个对象的时候,根据这个对象的访问权限,设置你代理允许对外表现的功能,实现安全访问。(不知道对不对)
4.智能指引,是指当调用真实的对象时,代理处理另外一些事[DP]
这个在链接中作者有好好说了,其实就是在代理里面处理了对象引用时的计数或者其他内务问题。
再来说说代理模式和装饰模式的异同:
唔,虽然网上有很多解答,但我觉得最简单的说法就是:
同:
都存放了被调用对象的引用。
装饰模式是用装饰链去为某个对象添加功能,防止类爆炸。m装饰类:1具体类。
代理模式是针对一对一的,A帮B表现B的功能。1代理类:1具体类。(想了下好像 1代理类:n具体类 也可以,反正不是m:1)
//问题:
1.
Q:什么时候用代理模式?
A:当你想隐蔽你的具体类,当你实现加载图片,当你实现远程代理,当你想在另外一个类内处理某个对象的内务。
代理模式,这个是看过的几个模式中最容易理解的了,但其实我觉得应用的地方还是蛮多的,至少虚拟代理这块就可以用在很多地方了。
//部分资料来源:
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:当你想隐蔽你的具体类,当你实现加载图片,当你实现远程代理,当你想在另外一个类内处理某个对象的内务。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用