JAVA设计模式之六代理模式
一代理模式:为其他对象【被代理者】提供一种代理【代理者】 以控制对这个对象【控制对被代理者】的访问。【代理者可以作任何东西的接口:网络连接、内存中的大物件、档案或其它昂贵或无法复制的资源。】
二UML类图:
Subject类:定义了RealSubject和Proxy的共用接口,这样就可以在任何使用RealSubject的地方都可以用Proxy。 【就是代理的接口里边包含具体被代理什么的方法 代理者Proxy 和真正的被代理者RealSubject都实现这个接口】
RealSubject类:定义Proxy所代表的真实实体。 【真正的被代理者对象】
Proxy类:保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。【里边创建被代理者的实体,,控制被代理者调用 该被代理者重写代理接口的方法】
Subject类
public abstract class Image { 抽象类有个展示图片的方法
public abstract void displayImage(); //被代理执行的动作
}
RealSubject类具体被代理者
public class RealImage extends Image {
private String filename;
public RealImage(String filename) { //具体被代理者的构造方法
this.filename = filename;
loadImageFromDisk(); //创造后就调用被代理者独有的方法
}
private void loadImageFromDisk() { //被代理者独有的方法
System.out.println("Loading " + filename);
}
@Override
//被代理者重新写 代理接口 让代理者去办的动作方法等待代理者 控制被代理者调用
public void displayImage() {
System.out.println("Displaying " + filename);
}
}
Proxy类
public classProxyImage extends Image {
private String filename;
private Image image;
public ProxyImage(String filename) { //代理者的构造方法
this.filename = filename;
}
@Override
public void displayImage() { //代理者重写 抽象代理类要去代理的方法,,创建具体被代理者 调用它的具体被执行的方法
if(image == null)
image = newRealImage(filename);
image.displayImage();
}
}
客户端代码:
public class ProxyClient {
public static void main(String[] args) {
//利用多态创建 被代理抽象类的具体 代理者 具体代理者 里边创建被代理者的实体 并控制这个对象调用具体被代理的方法
Image mImage1 = new ProxyImage("Andy.Photo1");
Image mImage2 = new ProxyImage("Andy.Photo2");
mImage1.displayImage();
mImage2.displayImage();
}
}
使用场景:
第一:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
第二:虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
第三:安全代理,用来控制真实对象访问时的权限。
第四:智能引用,是指当调用真实对象时,代理处理另外一些事。本文的例子就是采用了这一点。