代理模式: 为其他对象提供代理以控制对该对象的访问.
示例代码:
- //公共接口
- package designpattern.proxy;
- public interface Subject {
- public void request();
- }
- //被代理类
- package designpattern.proxy;
- public class RealSubject implements Subject{
- public void request() {
- System.out.println("message from real object.");
- }
- }
- //代理类
- package designpattern.proxy;
- public class ProxySubject implements Subject{
- private Subject real;
- public void request() {
- preRequest();
- if(real==null){
- real = new RealSubject();
- }
- real.request();
- postRequest();
- }
- private void preRequest(){
- System.out.println("do something before request comes.");
- }
- private void postRequest(){
- System.out.println("do something after request done.");
- }
- }
- //test case
- package designpattern.proxy;
- public class Test {
- public static void main(String[] args) {
- Subject s = new ProxySubject();
- s.request();
- }
- }
经典案例:
在hibernate中Session.load(Class, id)加载的对象就是实际对象的代理对象,只有真正需要这个对象的时候才从数据库中查询。
jdk动态代理:
- public class Test {
- public static void main(String[] args){
- Object o = Proxy.newProxyInstance(
- TT.class.getClassLoader(),
- new Class<?>[]{Subject.class},
- new InvocationHandler(){
- public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
- System.out.println("This is the proxy for method " + method.getName());
- return null;
- }
- }
- );
- Subject s = (Subject)o;
- s.request();
- }
- }
适应场景:远程代理, 安全代理