所谓代理模式,就是给某一对象提供代理对象,并由代理对象控制具体对象的应用
代理模式设计的角色:
1、抽象角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替
2、代理角色:含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作.
3、真实角色:定义了代理角色所代表的具体对象
现在写一个关于静态代理的例子:
1、抽象角色
/** * 抽象角色,提供了代理角色和真实角色的共同接口 * @author Administrator * */ public interface SubObject { public void request(); }2、真实角色
/** * 真实角色实现了抽象角色这个接口 * @author Administrator * */ public class RealSubObject implements SubObject { @Override public void request() { // TODO Auto-generated method stub System.out.println("RealSubObject 's request方法执行了..."); } }3、代理角色
public class MyProxy implements SubObject { private SubObject sub; public MyProxy(SubObject sub) { this.sub=sub; } @Override public void request() { this.predo(); sub.request(); this.afterdo(); } public void predo() { System.out.println("代理执行之前....."); } public void afterdo() { System.out.println("代理执行之后....."); } }
4、测试方法
public class ProxtTest { public static void main(String[] args) { RealSubObject real=new RealSubObject(); MyProxy proxy=new MyProxy(real); proxy.request(); } }以上便是一个简单的代理模式
下面在编写一个动态代理的例子:
1、抽象角色(同上)
2、真实角色(同上)
3、代理角色
public class MyInvocationHandler implements InvocationHandler { private Object obj; public MyInvocationHandler(Object obj) { this.obj=obj; } public Object factory() { Object proxy=null; proxy=Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this); return proxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub this.predo(); Object res=method.invoke(obj, args); this.afterdo(); return res; } public void predo() { System.out.println("代理执行之前..."); } public void afterdo() { System.out.println("代理执行之后..."); } public static void main(String[] args) { RealSubObject sub=new RealSubObject(); MyInvocationHandler handler=new MyInvocationHandler(sub); SubObject obj=(SubObject)handler.factory(); obj.request(); } }