当前位置: 首页 > 知识库问答 >
问题:

Java AbstractQueuedSynchronizer和模板方法模式

牧甫
2023-03-14

在阅读ReentrantLock的源代码时,我发现它在内部使用了一个同步器来控制锁,该同步器扩展了AbstractQueuedSynchronizer。Doug Lea在本文中提到,AbstractQueuedSynchronizer作为“模板方法模式”,有助于简化子类的编码。

然而,约书亚·布洛赫在《有效的Java》中建议,我们应该“支持组合而不是继承”,因为“与方法调用不同,继承违反了封装”。在我的理解中,Spring中的“模板”(例如RedisTemplate、TransactionTemplate等)遵循这个规则。

那么,回到AbstractQueuedSynChronizerReentantLock中定义的同步器,我想知道它的设计(基于模板方法模式)是否有任何缺点。非常感谢!

共有1个答案

胡厉刚
2023-03-14

对于AbstractQueuedSynchronizer,没有任何缺点,因为AbstractQueuedSynchronizer是以继承不会违反封装的方式精心编写的:

  • 子类没有可见字段
  • 所有方法(5个受保护的方法除外)都是final,因此子类无法更改它们
  • 子类只允许重写5个受保护的方法:tryAcquire()tryRelease()tryAcquireShared()tryReleaseShared()ISHELDExclusive()

实际上,这个实现相当于组合:只需将5个可重写的方法移动到专用接口。

 类似资料:
  • 问题 定义一个算法的结构,作为一系列的高层次的步骤,使每一个步骤的行为可以指定,使属于一个族的算法都具有相同的结构但是有不同的行为。 解决方案 使用模板方法( Template Method )在父类中描述算法的结构,再授权一个或多个具体子类来具体地进行实现。 例如,想象你希望模拟各种类型的文件的生成,并且每个文件要包含一个标题和正文。 class Document produceDocu

  • 亦称: Template Method 意图 模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式 (PDF、 DOC 或 CSV) 的文档, 程序则会试图从这些文件中抽取有意义的数据, 并以统一的格式将其返回给用户。 该程序的首个版本仅支持 DOC 文

  • 一、定义 模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 java中的抽象父类、子类 模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。 二、示例 Coffee or Tea (1) 把水煮沸 (2) 用沸水浸泡茶叶 (3) 把茶水倒进杯子 (4) 加柠檬 /* 抽象父类:饮料 */ var Beverage = function(){}; // (1) 把水煮沸

  • 一、模版方法模式的定义 模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。 二、模版方法模式的结构 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。 模板方法模式需要开发抽象类和具

  • 模板方法(Template Method) Intent 定义算法框架,并将一些步骤的实现延迟到子类。 通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。 Class Diagram Implementation 冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。 // java public abstract class CaffeineBeve

  • 介绍 模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找找我们,我们找你”,这指的是父类调用一个类的操作,而不是相反。具