使用动态代理解决网站字符集编码问题:(之前通过拦截器)
设计模式:
在软件开发的过程中,遇到相识的问题,将问题的解决方式抽象为模型(套路)
单例模式(静态代码只会执行一次),工厂模式,动态代理,装饰者模式,适配器
装饰者模式的介绍:
谷歌汽车场景:
1. Java设计了汽车开发的约定
interface ICar(start,run,stop)
class GoogleCar implements ICar{}
2. 希望在将谷歌car接入生态圈时候,增强汽车启动的功能
3.考虑的方向有:直接修改GoogleCar源码;使用继承
4. 二次开发的时候,如果无法获得源码,并且无法使用继承,final class,如果需要增强某个对象的一个方法的时候,要考虑装饰者模式。
前提是:可以获取到被装饰 的对象GoogleCar实现的所有接口,(ICar)
实现思路:自定义装饰类实现ICar接口,为自定义装饰类传递被装饰的对象(即:
main函数new的时候是这样的
ICar car = new MyCar(new GoogleCar())
)
ICar接口:对外公开的
谷歌开发的car,源码不对外开放:
我自己开发的car,增加一个有参构造器,实现ICar
启动main函数:记得构造器的参数要传入GoogleC对象:
这个就是所谓的装饰者模式。
装饰者的弊端:如果被实现的接口方法太多,装饰类中的方法过多冗余
解决方法:
动态代理模式:(代理对象)==》用于方法增强
原理:通过虚拟机在内存中创建类似于MyCar.class文件
要创建class文件告诉虚拟机:
1. 被创建的字节码文件应该有多少方法
2. 创建一个代理对象来增强这些方法
1. 字节码加载器:JDK有一些程序,专业将各种字节码文件加载到内存,这类程序简称字节码加载器
2. 如何将字节码文件class文件加载到内存?
底层实现过程是利用IO流技术,获取文件中的数据加载到内存,然后进行判断和检查。
加载器主要有三种:引导类加载器(BookStrapClassLoader),扩展类加载器(extensionClassLoader,ext),
应用类加载器(APPClassLoader,自定义的类)