You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
在 Spring 源码中, org.springframework.cache.transaction.TransactionAwareCacheDecorator 负责管理缓存同步事务相关,其构造方法接收被装饰对象为参数,通过这个对象,可以得到一个新的行为:为给定的目标缓存创建一个新的 TransactionAwareCache,其主要目的是提供缓存和 Spring 事务之间的同步级别。
privatefinalCachetargetCache;
/** * Create a new TransactionAwareCache for the given target Cache. * @param targetCache the target Cache to decorate */publicTransactionAwareCacheDecorator(CachetargetCache) {
Assert.notNull(targetCache, "Target Cache must not be null");
this.targetCache = targetCache;
}
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
适配器模式(Adapter)
把一个类接口转换成另一个用户需要的接口。
当需要在给定场景下(给定了接口),希望不改变自身行为的同时,又要达到其他目的的情况下可使用适配器设计模式。
实现
鸭子(Duck)和火鸡(Turkey)拥有不同的叫声,
Duck
调用quack()
方法,而Turkey
调用gobble()
方法。要求将
Turkey
的gobble()
方法适配成Duck
的quack()
方法,从而让火鸡冒充鸭子。JDK 中的应用
Spring 中的应用
Spring MVC 源码中,从
HandlerMapping
匹配的HandlerExecutionChain
需要转换成对应的HandlerAdapter
才能执行 handler 方法处理请求。而HandlerAdapter
是处理器包装成的适配器,会根据适配的结果调用真正的处理器的功能处理方法,返回ModelAndView
对象。而只有存在匹配的适配器,处理器才允许被执行。桥接模式(Bridge)
将抽象与实现分离开来,使它们可以独立变化。
实现
RemoteControl 表示遥控器,指代 Abstraction。
TV 表示电视,指代 Implementor。
桥接模式将遥控器和电视分离开来,从而可以独立改变遥控器或者电视的实现。
应用
JDK 中的应用
组合模式(Composite)
将对象组合成树形结构来表示“整体/部分”层次关系,允许用户以相同的方式处理单独对象和组合对象。
组件(Component)类是组合类(Composite)和叶子类(Leaf)的父类,可以把组合类看成是树的中间节点。
组合对象拥有一个或者多个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶子对象。
实现
应用
JDK 中的应用
Spring 中的应用
组合模式是基于具有共同行为的多个对象的存在,用于构建更大的对象,较大的对象仍然具有其各组成部分相同的特征(如 DOM 树的节点)。
在 Spring 源码中,
org.springframework.beans.BeanMetadataElement
接口用于配置 bean 对象,CompositeComponentDefinition
类似于组件,可以把叶节点BeanComponentDefinition
加入到私有列表中。装饰器模式(Decorator)
为对象动态添加功能,在不改变原有对象的基础上附加新功能(增加了一层包装),提供了比继承更有弹性的替代方案。
装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。
实现
设计不同种类的饮料,饮料可以添加配料,比如可以添加牛奶,并且支持动态添加新配料。每增加一种配料,该饮料的价格就会增加,要求计算一种饮料的价格。
下图表示在 DarkRoast 饮料上新增新添加 Mocha 配料,之后又添加了 Whip 配料。DarkRoast 被 Mocha 包裹,Mocha 又被 Whip 包裹。它们都继承自相同父类,都有 cost() 方法,外层类的 cost() 方法调用了内层类的 cost() 方法。
类应该对扩展开放,对修改关闭:也就是添加新功能时不需要修改代码。饮料可以动态添加新的配料,而不需要去修改饮料的代码。
不可能把所有的类设计成都满足这一原则,应当把该原则应用于最有可能发生改变的地方。
应用
JDK 中的应用
Spring 中的应用
在 Spring MVC 源码中,
HandlerAdapter
是 Handler 的适配,用于帮助DispatcherServlet
执行 Handler 逻辑,而无需关心调用细节。在 Spring 源码中,
org.springframework.cache.transaction.TransactionAwareCacheDecorator
负责管理缓存同步事务相关,其构造方法接收被装饰对象为参数,通过这个对象,可以得到一个新的行为:为给定的目标缓存创建一个新的 TransactionAwareCache,其主要目的是提供缓存和 Spring 事务之间的同步级别。外观模式(Facade)
提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。
实现
最少知识原则:只和你的密友谈话,也就是说客户对象所需要交互的对象应当尽可能少。
应用
JDK 中的应用
享元模式(Flyweight)
利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的。
实现
应用
JDK 中的应用
利用缓存来加速大量小对象的访问时间。
代理模式(Proxy)
通过创建代理对象覆盖真实对象;对于调用方而言,从直接访问对象转变为访问代理对象,可享用由代理对象的扩展功能,同时不会改变原来的行为方式。
实现
以下是一个虚拟代理的实现,模拟了图片延迟加载的情况下使用与图片大小相等的临时内容去替换原始图片,直到图片加载完成才将图片显示出来。
应用
JDK 中的应用
Spring 中的应用
在 Spring 源码中
org.springframework.aop.framework.ProxyFactoryBean
工厂根据 Spring bean 构建 AOP 代理,该类实现了定义getObject()
方法的FactoryBean
接口。调用该方法不是返回实例,而是 AOP 代理。在执行代理对象的方法之前,可以通过调用补充方法来进一步“修饰”代理对象。Beta Was this translation helpful? Give feedback.
All reactions