个人笔记分享:代理模式
结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。
代理模式的好处?
可以增强原类的功能,在函数执行前后做一些额外的操作。
代理模式的种类?
动态代理和静态代理。
静态代理和动态代理的区别?
静态代理需要我们自己写一个代理类。
动态代理系统自动帮我们生成一个代理类。
静态代理是在编译期间就需要完成的,相当于每个类都要创建一个代理类,这样的代码冗余量很大。
JDK提供的动态代理要求类实现invokationHandler接口,然后在运行时才去创建代理类,解决了静态代理代码冗余的问题。
静态代理的例子?
写一个接口,然后被代理类实现接口,代理类也实现接口。
// 定义一个名为Person的接口,其中包含一个名为doWork()的方法声明 interface Person { void doWork(); } // 实现Person接口的Student类 class Student implements Person { // 重写doWork()方法以提供其实现 public void doWork() { System.out.println("学习"); // 当方法被调用时打印"学习" } } // 同样实现Person接口的StartWorkingBoy类,该类有一个Person类型的成员变量 class StartWorkingBoy implements Person { private Person person; // 类型为Person的成员变量,用于引用 // 构造函数,初始化person成员变量 public StartWorkingBoy(Person person) { this.person = person; } // 重写doWork()方法以提供其实现 @Override public void doWork() { System.out.println("找到一份工作"); // 当方法被调用时打印"找到一份工作" person.doWork(); // 调用person对象的doWork()方法 System.out.println("开始挣钱养家------"); // 在调用doWork()后打印额外的信息 } }
动态代理有几种?
jdk动态代理和spring动态代理。
jdk动态代理的例子
public static void main(String[] args) { List<String> list = new ArrayList<>(); List<String> proxyInstance = (List<String>) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开始执行" + method.getName()); if (method.getName().equals("toString")) { System.out.println("特殊方法"); } // 必须是原对象 Object invoke = method.invoke(list, args); System.out.println("结束执行" + method.getName()); return invoke; } }); proxyInstance.add("xxx"); System.out.println(proxyInstance); }
spring底层是如何抉择使用哪种动态代理的?
由于反射已经被优化了,jdk动态代理速度也很快了,所以实现了接口的话,使用jdk动态代理,不然使用cglib。