个人笔记分享:代理模式
结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。
代理模式的好处?
可以增强原类的功能,在函数执行前后做一些额外的操作。
代理模式的种类?
动态代理和静态代理。
静态代理和动态代理的区别?
静态代理需要我们自己写一个代理类。
动态代理系统自动帮我们生成一个代理类。
静态代理是在编译期间就需要完成的,相当于每个类都要创建一个代理类,这样的代码冗余量很大。
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。
