每天一个设计模式之proxy
2011-06-01 16:00
274 查看
第一印象是,从字面意思理解貌似和adapter差不多吧~
http://www.oodesign.com/proxy-pattern.html
比如有一个查看图片的程序,会展现一个目录下所有的图片。于是有一个类,在用户指定一个目录后,会将改目录下所有的图片load进内存后display出来。
而proxy class的作用就是用轻量级的操作代替真实类中的heavy的操作。
又比如,我们需要打开一个文档,文档后面分部包含一些图片。当我们刚开始打开文档时,并不需要立即load这些图片。我们可以什么都不做,
或者用一个虚拟的东西来代替图片被载入。只有当用户查看文档后面部分的时候,才load这些图片。
这样用proxy代替载入的时候,我们可以做一些额外的动作,最终达到即可以快速的打开文档,在需要显示图片的时候又可以迅速的显示出来。
通常可以是用preOperation()和postOperation()等。
因此proxy根据目的还能分成好几种:
Remote Proxy的情况,可以为一个远端真实物件提供一个局部代表;
Protection Proxy控制对物件的访问,您可以使用它来作不同级别、权限的存取控制;
Cache Proxy为一个物件提供临时的储存,使得许多客户端都能直接存取它,而不用对真实物件直接要求,只有在必要的时候更新这个临时物件,或是让客户直接存取真实物件。
http://www.oodesign.com/proxy-pattern.html
比如有一个查看图片的程序,会展现一个目录下所有的图片。于是有一个类,在用户指定一个目录后,会将改目录下所有的图片load进内存后display出来。
public class HighResolutionImage implements Image { public HighResolutionImage(String imageFilePath) { loadImage(imageFilePath); } private void loadImage(String imageFilePath) { // load Image from disk into memory // this is heavy and costly operation } @Override public void showImage() { // Actual Image rendering logic } }//所以在实例化该类的时候就会load所有的图片,然后调用showImage显示。 //而如果只调用了一部分图片的showImage(只查看了一部分),那么load所有图片进内存就是资源的浪费。
而proxy class的作用就是用轻量级的操作代替真实类中的heavy的操作。
又比如,我们需要打开一个文档,文档后面分部包含一些图片。当我们刚开始打开文档时,并不需要立即load这些图片。我们可以什么都不做,
或者用一个虚拟的东西来代替图片被载入。只有当用户查看文档后面部分的时候,才load这些图片。
这样用proxy代替载入的时候,我们可以做一些额外的动作,最终达到即可以快速的打开文档,在需要显示图片的时候又可以迅速的显示出来。
通常可以是用preOperation()和postOperation()等。
因此proxy根据目的还能分成好几种:
Remote Proxy的情况,可以为一个远端真实物件提供一个局部代表;
Protection Proxy控制对物件的访问,您可以使用它来作不同级别、权限的存取控制;
Cache Proxy为一个物件提供临时的储存,使得许多客户端都能直接存取它,而不用对真实物件直接要求,只有在必要的时候更新这个临时物件,或是让客户直接存取真实物件。
看一个和上面image viewer对应的proxy: public class ImageProxy implements Image { /** * Private Proxy data */ private String imageFilePath; /** * Reference to RealSubject */ private Image proxifiedImage; public ImageProxy(String imageFilePath) { this.imageFilePath= imageFilePath; } @Override public void showImage() { // create the Image Object only when the image is required to be shown proxifiedImage = new HighResolutionImage(imageFilePath); // now call showImage on realSubject proxifiedImage.showImage(); } }//所以这个proxy被实例化时不会做任何事儿。只有用户需要查看图片(调用showimage)时,才会load image。
相关文章推荐
- 每天一个设计模式之Proxy
- 每天一个设计模式之command
- 每天一个设计模式之 -- 抽象工厂模式
- 每天一个设计模式之Flyweight
- 每天一个设计模式之Observer
- 每天一个设计模式之Decorator模式解决类间组合爆炸问题
- 《每天学一个设计模式》 之 策略模式
- 每天一个设计模式之strategy
- 每天一个设计模式
- 每天一个设计模式之 -- 单例模式
- 每天一个设计模式(6):抽象工厂模式
- 每天一个设计模式之 -- 建造者模式
- 每天一个设计模式之 -- 适配器模式
- 每天一个设计模式之 -- 装饰器模式
- 每天一个设计模式(7):单例模式
- 每天一个设计模式: 命令模式(Command)
- 每天一个设计模式(2):观察者模式
- 每天一个设计模式之 -- 桥接模式
- 每天一个设计模式(8):代理模式
- 每天一个设计模式之Adapter