Jdk、Spring中设计模式应用
2021-06-06 11:42:53 102 举报
图解部分设计原则 大部分设计模式在jdk、spring源码中应用,涉及到的类的类间关系 对您有帮助的话点个赞支持一下呗
作者其他创作
大纲/内容
StringBuilder建造者模式
不能实例化的建造者:实现创建对象需要的方法
通过模板实现接口方法
抽象
HandlerExecutionChain
接口隔离原则
HandlerAdapter
抽象建造者:提供创建对象需要的方法
聚合接口
业务中的被观察者
B
用方法1用方法2
对应类型的Controller/Handler
InternalSpelExpressionParser
HttpRequestHandlerAdapter
提供聚合方式
C
实现方法1实现方法2实现方法3
创建代理的工厂接口
观察者接口
A可以通过聚合B来调B的方法
抽象表达式
ObjectFactory
Observer
Expression
getValue(...)
Appendable
SpelExpression
final String expression
DispatchServlet适配器模式
JDBC4Connection
设计原则
List
被迭代对象
StatementCallback<T>
T doInStatement(Statement stmt)
方法1(C c)
JDBCTemplate
CompositeStringExpression
AbstractRefreshableApplicationContext
final void refreshBeanFactory()final ConfigurableListableBeanFactory getBeanFactory()
ConfigurableApplicationContext的refresh()模板方法
实现方法6实现方法7
DefaultReflectorFactory
ArrayList
Iterator<E> iterator()
获取代理对象的接口
jdk代理Proxy.newProxyInstance方法要传的参数之一
参数强转
A
方法1方法2方法3
Iterator
boolean hasNext()E next()default void remove()default void forEachRemaining(Consumer<? super E> action)
AbstractStringBuilder
迭代器接口
StringBuilder
命令调用者
具体命令&命令接收者
实现方法1实现方法2
DriverManager类型单一,无子类
合成复用原则
ISQLServerConnection
Object
DriverManager桥接模式
具体类型Controller/Handler的实现
Jdk代理
DataInputStream
DataInputStream(InputStream in)
功能接口功能类
TemplateAwareExpressionParser
DispatcherServlet
leaf
com.mysql.jdbc.MySQLConnection
被装饰者
ArrayList迭代器模式
接口A
继承会用有父类所有非private属性、方法,B继承A仅为了用A的方法耦合性太强
里氏替换原则
将职责链上的类抽象成功能接口,直接在方法里实现功能
实现接口成为观察者
B只用方法1、2,通过接口调C,但A提供了方法3,B又用不到方法3
环境角色
AopProxy
Object getProxy()Object getProxy(@Nullable ClassLoader classLoader)
InvocationHandler
B用到了C,直接调C就限制住了,不能在调其他的类
ObjenesisCglib代理
A(接口/父类)
方法1方法2
模板方法里某些方法的实现类接口方法
mybatis的Configuration外观模式
JdkDynamicAopProxy
JdkDynamicAopProxy(AdvisedSupport config)
具体建造者:实现创建对象需要的方法指挥者:调用建造者方法创建对象;供外界调用
Observable观察者模式
Iterable
Iterator<T> iterator()default void forEach(Consumer<? super T> action)default Spliterator<T> spliterator()
其它实现类
Itr
AOP动态代理
HashMap组合模式
A、B由父子关系变成兄弟关系,继承共同的父类
QueryStatementCallback
直接实现接口方法,而非调用接收者提供的方法:既是命令类又是命令接收者
Base
A、B共同点
DriverManager
Cglib代理
非中介符表达式
SpelExpressionParser
ReflectorFactory
装饰者
MetaObject
用方法1用方法2不用方法3
Collection
InputStream
SimpleControllerHandlerAdapter
ConnectionImpl
CglibAopProxy
FilterInputStream
protected volatile InputStream in
DefaultObjectWrapperFactory
Observable
boolean changed = falseVector<Observer> obs
void addObserver(Observer o)void deleteObserver(Observer o)void notifyObservers()notifyObservers(Object arg)int countObservers()
HashMap
ObjectWrapperFactory
业务中的观察者
AopProxyFactory
AopProxy createAopProxy(AdvisedSupport config)
DispatcherServletdoDispatch()拦截请求进行处理职责链模式
Configuration
MetaObject newMetaObject(Object object)
子类全部重写父类方法,继承的意义就不大了
UpdateStatementCallback
ComponentImpl
外观类
HandlerInterceptor
List<HandlerAdapter> handlerAdaptersList<HandlerMapping> handlerMappings
AbstractMap
GenericApplicationContext
DefaultAopProxyFactory
依赖倒置原则
DefaultObjectFactory
JDBCTemplate命令模式
java.sql.Connection
获取被代理对象的类
重写方法1重写方法2重写方法3
命令接口
继承父类称为被观察者
com.mysql.jdbc.Connection
具体装饰者
ByteArrayInputStream
应该将A的方法3拆分出去,B用什么接口就提供什么
Map
Component
具体迭代器
管理观察者
SQLServerConnection
中介符表达式
BufferedInputStream
SpelExpressionParser解释器
创建代理的工厂类
ExpressionParser
Node
K getKey()V getValue() V setValue(V newValue)
ObjenesisCglibAopProxy
应将C抽象,把抽象作为B方法的参数,必要时B也要进行抽象,让抽象和抽象之间依赖
AdvisedSupport
加了一层,在MetaObject组织功能类
AbstractApplicationContext
void refresh()-模板方法postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)-钩子方法void onRefresh()-钩子方法ConfigurableListableBeanFactory obtainFreshBeanFactory()-内含2抽象方法:abstract void refreshBeanFactory()abstract ConfigurableListableBeanFactory getBeanFactory()
FilterInputStream装饰者模式
FileInputStream
实现方法4实现方法5
ConfigurableApplicationContext
void refresh()
B用不到的方法也会继承过来
封装链上结点的对请求的处理
0 条评论
下一页
为你推荐
查看更多