一、使用场景
1、远程代理:也就是对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同的地址空间的事实。
2、虚拟代理:例如hibernate中的一对多中的多在lazy为true时暂时不加载,只用一个代理来表示。
3、安全代理:用来控制实际对象访问的权限。
4、在代理对象的方法被调用时,代理可以做一些其他的操作。诸如AOP等策略。
例如:假设有一组对象都实现同一个接口,实现同样的方法,但这组对象中有一部分对象需要有单独的方法,传统的笨办法是在每一个应用端都加上这个单独的方法,但是代码重用性低,耦合性高。如果用代理的方法则很好的解决了这个问题。
二、UML类图
三、实现代码
1、代理与真实对象继承的接口
package com.designmodel.test4;
public interface Subject {
public void request();
}
2、真实对象
package com.designmodel.test4;
public class RealSubject implements Subject {
@Override
public void request() {
System.err.println("调用真实对象的方法");
}
}
3、代理对象
package com.designmodel.test4;
public class Proxy implements Subject{
private Subject subject;
public Proxy(Subject subject) {
this.subject = subject;
}
@Override
public void request() {
System.err.println("调用之前");
subject.request();
System.err.println("调用之后");
}
public static void main(String args[])
{
Subject subject = new RealSubject();
Proxy p = new Proxy(subject);
p.request();
}
}