代理模式
背景:
1.某个被称为实主的类提供了一项服务,此服务是由主类型的一个接口类型指定的。
2.为了使服务更为通用,需对它进行修改。
3.用户和实主都不会因为修改而受影响。
解决方案
1.定义一个实现次接口类型的代理类,代理保留了实主的一个引用,同时它知道如何去定位实主。
2.用户使用一个代理对象。
3.每个代理会调用实主的相同方法,并提供必要的修改。
类图:
下面是适配器模式的类图:
关于适配器模式的说明可见上一篇:桥接和代理的对比
http://blog.csdn.net/notruiyi/archive/2005/10/24/514940.aspx
由上图可看出,一般的代理模式要设计统一的接口,而适配器模式却不需要,为什么呢?其实代理模式很多情况下还使用在分布式环境下,所以实现了统一的接口,就是实现了网络程序之间的协议,程序要通过这个接口进行交流而不是类。
实例类图:
程序示例:
Icon是java自带接口,所以不列出。
Image是java自带类,所以不列出。
-----------------------------------------------------------------------------------------------------------------
public class ImageProxy implements Icon{
private String name;
private ImageIcon image;
public ImageProxy(String name){
this.name = name;
image = null;
}
public void ensureImageLoaded(){
if(image == null)
image = new ImageIcon(name);
}
public int getIconWidth(){
ensureImageloaded();
return image.getIconHeight();
}
public int getIconHeight(){
ensureImageLoaded();
return image.getIconHeight();
}
public void paintIcon(Conponent c ,Graphics g ,int x ,int y){
ensureImageLoaded();
image.paintIcon(c,g,x,y);
}
}
由以上可见,在真正调用图象的数据以前,图象是不真正载入的。