今天看到模式设计上有一章为“代理模式”,刚好在JAVA里也有代理模式这样的例子,研究半天,总算看懂了,以下是我的一点总结:
1、代理模式的用处:当我们需要访问某个对象时,我们可能并不关心能准确得到该对象,它只要一个能提供该功能的对象即可,此时我们就可以返回对象的代理。
2、怎样用JAVA实现:我们不直接实现类的代理,而是先新建一个接口。此例模拟一个大图片的装载类
(1)新建一个图片接口:
package org.proxy; public interface Image { public void show(); }
(2)新建一个大图片类,实现Image接口,为了模拟大图片的载入,我们让程序暂停2秒。
package org.proxy; public class BigImage implements Image{ @Override public void show(){ System.out.println("绘制大图片……"); } public BigImage(){ try{ Thread.sleep(2000); System.out.println("图片装载成功……"); } catch(Exception e){ e.printStackTrace(); } } }
(3)新建BigImage类的代理,以后我们就依靠此类来进行对BigImage的代理。需要注意的是,我们是在重写接口的方法对BigImage进行初始化。这样新建一个ProxyImage对象的话,就可当成BigImage对象来使用。
package org.proxy; public class ProxyImage implements Image{ private Image image; public ProxyImage(Image image){ this.image=image; } public void show(){ if(image==null){ image=new BigImage(); } image.show(); other(); } public void other(){ System.out.println("代理类的方法"); } }
(4)测试类
package org.proxy; public class Test { public static void main(String... args){ long start=System.currentTimeMillis(); Image image=new ProxyImage(null); long end=System.currentTimeMillis()-start; System.out.println("系统得到Image对象的时间开销:"+end); image.show(); } }
此例的结语:
我们可以看到系统得到Image对象的开销为零。你可能要问了,虽然利用代理方式确实提高了性能,但是在ProxyImage类show()方法中还是新建了一个BigImage对象,还是要占用内存开销的。只不过这是一种拖延方式。真的有用吗?答案是肯定的。
第一,我们把BigImage对象的创建放到真正使用的时候。这样能保证前面代码的运行流畅。还可以减少BigImage在内存中存在的时间。
第二,在一些情况下可能都不会用要ProxyImage中的show(),这种延迟新建新建那就很有必要,在很大的程度上节省了内存的占用。
第三,我在ProxyImage还添加了一个other()方法,以后如果要对此例添加其它操作,就可以只要操作ProxyImage类。这样便于扩展。