# DesignPattern **Repository Path**: hsylient/design-pattern ## Basic Information - **Project Name**: DesignPattern - **Description**: 设计模式的简单理解。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-30 - **Last Updated**: 2023-03-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 设计模式 > 主要是在项目中遇到的一些常见的设计模式,见得多了有些感觉了,总结了一下。 > 代码的质量,以及其中的一些细节会不停的迭代,同时也会写一些自己的心得。 # 代理模式 1. 代理模式的概念是什么? > 为目标对象提供一个替身,以控制这个对象的访问。即通过代理对象去访问目标对象 2. 为什么要使用代理模式? > 这样做的好处是在不修改目标对象的基础上,对目标对象增强额外的功能,对目标对象进行拓展 3. 怎么实现代理? > 代理模式有三种不同的形式 1.静态代理 2.动态代理 cglib代理 4. 静态代理 > 1. 首先在jdk中Thread类中就用到了静态代理。Thread类实现了Runnable接口,同时将一个实现了Runnable接口的实现类作为了 > 属性(private Runnable target)。我们在创建线程的时候,可以通过实现Runnable接口的方式去实现,将这个实现了Runnable接口 > 的实现类作为参数给到Thread类的构造方法,然后调用了start()方法。在构造方法执行的时候(创建对象),内存空间开辟, > 实例化了target成员变量。然后Thread类也实现了Runnable接口,重写了run()方法,Thread类就是在这个run()方法中对我们创建的线程对象的功能进行了拓展。 > 2. 缺点:因为代理对象和被代理对象要实现同样的接口,一旦接口中的方法增加,代理对象和被代理对象都要维护 比较费劲(子类需要全部增加接口中的方法) 5. jdk动态代理 > 1. 代理对象不需要实现接口,但是被代理对象需要实现接口 > 2. 代理对象是利用jdk的api动态的在内存中构建的对象 > 3. 动态代理也叫jdk代理、接口代理 6. cglib动态代理 > 1. 首先jdk动态代理和静态代理都需要目标对象是一个实现接口的对象,而cglib不需要 > 2. spring的aop就用到了cglib的动态代理 > 3. 被代理的类不能被final修饰,被代理的方法不能是被final和static修饰的方法,这样的话不会被拦截到