代理设计模式
1.代理设计模式优点
保护真实对象、让真实对象职责更明确、扩展功能
2.静态代理设计模式
由代理对象代理所有真实对象的功能
自己编写代理类
每个代理的功能需要单独编写
3.静态代理设计模式缺点
当代理功能比较多时,代理类中方法需要写很多
public class Laozong implements Gongneng{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Laozong(String name) { super(); this.name = name; } public Laozong() { super(); } public void mianshi(){ System.out.println("面试"); } }
public class MiShu implements Gongneng{ private Laozong laozong = new Laozong("云云"); @Override public void mianshi() { System.out.println("请问你有预约吗?"); laozong.mianshi(); System.out.println("把访客信息备注"); } }
public interface Gongneng { void mianshi(); }
4.动态代理
为了解决静态代理频繁编写代理功能的缺点
分类:
JDK动态代理
cglib动态代理
5.JDK动态代理
优点:jdk自带,不需要额外导入jar
缺点:
真实对象必须实现接口
利用反射机制,效率不高
public class Laozong implements Gongneng{ @Override public void chifan() { System.out.println("吃饭"); } @Override public void mubiao() { System.out.println("目标"); } }
public class Mishu implements InvocationHandler{ private Laozong laozong=new Laozong(); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("预约时间"); Object result = method.invoke(laozong, args); System.out.println("记录访客信息"); return result; } }
public class Women { public static void main(String[] args){ Mishu mishu = new Mishu(); /** * 第一个参数:反射时使用的类加载器 * 第二个参数:Proxy需要实现什么接口 * 第三个参数:通过接口对象调用方法时,需要调用哪个类的invoke方法 */ Gongneng gongneng = (Gongneng)Proxy.newProxyInstance(Women.class.getClassLoader(), new Class[]{Gongneng.class}, mishu); gongneng.chifan(); } }
6.cglib动态代理
优点:
基于字节码,生成真实对象的子类
运行效率高于JDK动态代理
不需要实现接口
缺点:非JDK功能,需要额外导入jar
public class Laozong{ public void chifan() { System.out.println("吃饭"); } public void mubiao() { System.out.println("目标"); } }
public class Mishu implements MethodInterceptor{ @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("预约时间"); //invoke()调用子类重写方法 arg3.invokeSuper(arg0, arg2); return null; } }
public class Women { public static void main(String[] args){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Laozong.class); enhancer.setCallback(new Mishu()); Laozong laozong = (Laozong)enhancer.create(); laozong.chifan(); } }