您的位置:首页 > 其它

每天一个设计模式之proxy

2011-06-01 16:00 274 查看
第一印象是,从字面意思理解貌似和adapter差不多吧~
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: