每天一个设计模式之proxy

第一印象是,从字面意思理解貌似和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。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值