代理模式是一种常见的设计模式。代理类,委托类实现相同的抽象接口,一个代理类中包含一个委托类的对象,与委托类相关联;代理类主要负责为委托类预处理消息,把消息转发给委托类,及事后处理消息;代理类本身不实现真正的服务而是调用代理类的对象完成相关服务。
1.接口类
public interface AbstractObject{ public void operation(){}; }2.委托类
public class RealObject implements AbstractObject{ @override public void operation(){ System.out.println("Here is RealObject"); } }3.代理类
public class ProxyObject implements AbstractObject{ private RealObject realObj; public ProxyObject(RealObject realObj){ this.realObj=realObj; } @override public void operation(){ System.out.println("预处理一些消息"); realObj.operation();//调用委托类方法实现真正服务 System.out.println("事后处理一些消息"); } }4.测试类
public class TextProxy{ @override public static void main(String[] args){ RealObject realObj=new RealObj(); ProxyObj proxyObj=new ProxyObj(realObj); proxyObj.operation(); } }1.代理类
public class ProxyObject implements Invocationhandler{ private Object realObj; public Object bind(Object realObj){ this.realObg=realObj; retrun Proxy.newProxyinstance(realObj.getClass().getClassLoader(),realObj.getClass().getInterfaces(),this); } @override public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{ Object result=null; System.out.println("预处理一些消息"); result=method.invoke(realObj,args); System.out.println("事后处理一些消息"); } }2.测试类
public class TextProxy{ public static void main(String[] args){ ProxyObject proxyObj=new ProxyObject(); AbstractObject abstractObj=proxyObj.bind(new RealObject()); abstractObj.operation(); } }1.代理类
public class ProxyObject implements MethodInterceptor{ private Object realObj; public Object getInstance(Object realObj){ this.realObj=realObj; Enhancer enhancer=new Enhancer(); enhancer.setSuperClass(this.realObj.getClass()); enhancer.setCallback(this); retrun enhancer.create(); } @override public object intercept(Object obj,Method method,Object[] args,MethodProxy proxy)throws Throwable{ System.out.println("预处理一些消息"); proxy.invokeSuper(obj,args); System.out.println("事后处理一些消息"); return null; } }2.测试类
public class TestProxy{ public static void main(String[] args){ ProxyObject proxyObj=new ProxyObject(); RealObject realObj=proxyObj.getInstance(new RealObject()); realObj.operation(); } }