[Design pattern]: 设计模式相关系列
什么时候可以使用代理模式?
需要在原有功能的基础上神不知鬼不觉的增加一些额外功能时,使用代理模式.
如何实现?
1,接口定义
1 2 3 4 5 6
| package kooko.com.proxy;
public interface HelloWorld { public void sayHelloWorld(); public void sayBye(); }
|
2,接口实现
1 2 3 4 5 6 7 8 9 10 11 12
| package kooko.com.proxy;
public class HelloWorldImpl implements HelloWorld{
public void sayHelloWorld(){ System.out.println("say hello"); }
public void sayBye(){ System.out.println("say bye"); } }
|
3,代理功能类实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| package kooko.com.proxy.handler;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;
import kooko.com.proxy.HelloWorld; import kooko.com.proxy.HelloWorldImpl;
public class HelloWorldHandler implements InvocationHandler{ private Object obj;
public HelloWorldHandler(Object obj){ super(); this.obj = obj; } public HelloWorldHandler(){ super(); }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; doBefore(); result = method.invoke(obj, args); doAfter(); return result; }
private void doBefore(){ System.out.println("before say hello"); }
private void doAfter(){ System.out.println("after say hello"); }
public void setObject(Object xxx){ this.obj=xxx; }
}
|
4,调用测试方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public static void main(String[] args){ InvocationHandler handler = new HelloWorldHandler(new HelloWorldImpl()); HelloWorldHandler xxxx= new HelloWorldHandler(); xxxx.setObject(new HelloWorldImpl()); InvocationHandler handler = xxxx; //这里需要类加载器 HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(new HelloWorldHandler().getClass().getClassLoader() , new HelloWorldImpl().getClass().getInterfaces(), handler); proxy.sayHelloWorld(); proxy.sayBye(); //什么时候可以使用呢 //封装一个代理服务类,当需要调用方法的前后做一些事情的时候,利用代理服务类来生成对象就可以了 }
|