代理模式(Proxy)动态代理
介绍一下jdk自带动态代理。
java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler
使用动态代理,还可以完成对实现了某些接口的类的特定方法进行改造。
下面用代码来说明:
1.首先还是创建Star接口和真实明星的对象:
package com.note.pattern.proxy.dynamicproxy; public interface Star { /** * 面谈 */ void confer(); /** * 签合同 */ void signContract(); /** * 订票 */ void bookTicket(); /** * 唱歌 */ void sing(); /** * 收钱 */ void collectMoney(); }
package com.note.pattern.proxy.dynamicproxy; public class RealStar implements Star{ @Override public void confer() { System.out.println("RealStar.confer()"); } @Override public void signContract() { System.out.println("RealStar.signContract()"); } @Override public void bookTicket() { System.out.println("RealStar.bookTicket()"); } @Override public void sing() { System.out.println("RealStar(周杰伦本人).sing()"); } @Override public void collectMoney() { System.out.println("RealStar.collectMoney()"); } }
2.创建Handler类,继承InvocationHandler类即可:
package com.note.pattern.proxy.dynamicproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class StarHandler implements InvocationHandler{ private Star mRealStar; public StarHandler(Star star) { mRealStar = star; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object object = null; System.out.println("真正的方法执行前!"); System.out.println("面谈,签合同,预付款,订机票"); if (method.getName().equals("sing")) { object = method.invoke(mRealStar, args); } System.out.println("真正的方法执行后!"); System.out.println("收尾款"); return object; } }
3.代理对象可以在客户端直接创建:
package com.note.pattern.proxy.dynamicproxy; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { Star realStar = new RealStar(); StarHandler starHandler = new StarHandler(realStar); Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {Star.class},starHandler); proxy.sing(); } }