https://www.jianshu.com/p/d6ff54d72afb
目录
一.代理模式
通过生成代理对象,控制原对象的或者增强原对象。
静态代理
jdk动态代理:代理接口 实现InvocationHandler,通过反射生成代理对象,执行invoke方法
cglib动态代理:代理接口或者类
用例:springaop,mybatismpper,mybits拦截器,
如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);
如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理
二.责任链模式
通常每个接收者都包含对另一个接收者的引用!为请求创建了一个接收者对象的链,并在该链上传递请求,直到有一个接收者对象处理它。通过让更多对象有机会处理请求,避免了请求发送者和接收者之间的耦合。
SubjectChain持有处理对象的集合private List<Subject> successors, process调用每一个Subject的execute,execute方法执行之后会再调用链上process的方法循环;
用例:mybits拦截器InterceptorChain,servlet中的filter
三.策略模式
一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
Context 持有Strategy抽象类,executeStrategy执行每一个Strategy里的方法
四.观察者模式
当一个对象被修改时,则会自动通知它的依赖对象
Subject(被观察的对象)持有观察者集合List<Observer> observers,通常还提供添加attach和删除detach
观察者的方法,被观察者状态变化setState通知所有观察者notifyAllObservers()
五.适配器模式
适配器模式是将一个类的接口转换成客户希望的另外一个接口,
类适配器模式:适配器继承目标类
对象的适配器模式:适配器持有目标类对象
接口的适配器模式:多个适配器实现接口,接口向外提供统一方法
springmvc中调用handle的方法用到了适配器模式,(宽泛的概念Controller,以及HttpRequestHandler,Servlet,等等)适配器实现适配器接口,调用的时候每个适配器判断出入的handladpter是不是当前类型,如果是,调用handle处理.
六.模板方法
为防止恶意操作,一般模板方法都加上 final 关键词.
完成某一个功能,有几个固定的步骤,但每个步骤的实现根据具体对象的不同,实现的细节也不同。模板方法模式可以让具体的实现细节由子类来完成,而在父类中定义好骨架
七.装饰者模式
- 目标接口实现类和包装器抽象类都是目标接口的实现.
- 包装器抽象类有各种继承,各种继承在目标接口方法前后包装
- 包装器创建时传入目标类实现,产生的都是目标接口的实现
- 代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造
八.工厂模式
九.单例模式
保证一个类仅有一个实例
- 懒汉式,线程不安全,需要时再创建对象
- 懒汉式,线程安全,需要时再创建对象,获取对象的方法加上synchronized
- 饿汉式,线程安全,初始化时就创建对象去,对象属于静态成员变量,所以线程安全,没有 实现懒加载
双检锁/双重校验锁,volatile加synchronized