通过此例说明代理模式的作用,在创建一个对象需要很大系统开销的时候,我们只需要给用户一个代理对象,而在需要使用对象的时候,再去实例化对象,从而减少不必要的系统开销
加载一个很大的图片模拟系统开销
图片接口
package com.meteor.design_pattern.proxy;
/**
* Created by Meteor on 2016/3/27.
*/
public interface Image {
void show();
}
加载大图片的实现
package com.meteor.design_pattern.proxy;
/**
* 使用该BigImage模拟一个很大的图片
* Created by Meteor on 2016/3/27.
*/
public class BigImage implements Image {
public BigImage(){
try {
//暂停模拟系统开销
Thread.sleep(3000);
System.out.println("图片装在成功");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void show() {
System.out.println("绘制实际的大图片");
}
}
图片的代理
package com.meteor.design_pattern.proxy;
/**
* Created by Meteor on 2016/3/27.
*/
public class ImageProxy implements Image{
private Image image;
public ImageProxy(Image image){
this.image = image;
}
/**
* overide show()
* 该方法用于控制对被代理对象的访问
* 并根据需要负责创建和删除被代理对象
*/
public void show(){
if(image == null){
image = new BigImage();
}
image.show();
}
}
TEST
package com.meteor.design_pattern.proxy;
/**
* Created by Meteor on 2016/3/27.
*/
public class BigImageTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
Image image = new ImageProxy(null);
System.out.println("系统得到Image对象的时间开销:"+(System.currentTimeMillis()-start));
//只有实际调用image代理的show()方法时,程序才会真正创建被代理对象
image.show();
}
}