首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

模板模式:一种体现多态的设计模式

0x01:模板模式

模板模式(Template),又叫模板方法模式(Template Method),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。UML类图如下:

主要包含如下角色:

AbstractClass(抽象模板类):在抽象类中定义了一系列基本操作,这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。

ConcreteCalss(具体模板子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

抽象模板类:定义一个模板方法来组合sing()和dance()两个方法形成一个算法,然后让子类重定义这两个方法。

具体模板类:这里定义两个具体模板类,ConcreteClassLiMing及ConcreteClassLiuDeHua来进行测试,继承抽象模板类,实现具体方法。

Client客户端:

通过以上代码就实现了一个简单的模板模式,模板模式的优点:封装不变部分,扩展可变部分。提取公共代码,便于维护。行为由父类控制,子类实现;缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

0x02:JDK中的模板模式

默认情况下,以上这些方法都抛出 UnsupportedOperationException。这些方法的实现必须是内部线程安全的,并且通常应该简短而不是阻塞。AQS类中的其他方法都是final ,所以无法被其他类使用,只有这几个方法可以被其他类使用。

0x03:Spring中的模板模式

Spring作为一个特优秀的框架,底层大量使用模板模式。以Spring的事务管理器来讲下Spring中的模板模式。

AbstractPlatformTransactionManager是Spring中的模板抽象类,它的继承关系图如下:

实现了PlatformTransactionManager接口,重载了接口中的方法。

模板方法:事务管理器中抽象类中的模板方法不止一个,比如以下两个方法

这两个方法都对于自己要实现的逻辑搭建了一个骨架,主要的功能是由抽象方法完成,由子类来完成。

抽象方法:事务管理器抽象类中的抽象方法定义了多个,分别用于处理不同的业务逻辑,由子类实现其中具体的逻辑。

抽象方法的定义便于子类去扩展,在保证算法逻辑不变的情况下,子类能够定制自己的实现。

具体子类:其中有DataSourceTransactionManager、JtaTransactionManager、RabbitTransactionManager等,类继承关系如下:

另外还有JdbcTemplate、JpaTemplate等使用了模板模式。其他需要大家慢慢去发现,去学习~~~

书山有路勤为径,学海无涯苦作舟!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201207A0HKXI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券