模板模式
模板模式是一种行为型设计模式,它定义了一个算法的骨架,将一些复杂流程的实现步骤封装在一个抽象类中,而将一些具体实现步骤延迟到子类中实现。
在 模板模式(Template Pattern)中,一个抽象类公开定义了 执行它的方法的 方式/模板 。它的子类可以按需重写方法实现,但调用将以 抽象类中定义的 方式进行,这种类型的设计模式属于 行为式模式
意图: 定义一个 操作中的算法的骨架,而将一些步骤 延迟到子类中。 模板方法使得子类可以不改变一个算法的 结构即可 重定义该算法某些特定的 步骤
主要解决: 一些方法通用,却在每一个子类都 重新写了这一个方法
何时使用: 有一些通用的方法
如何解决: 将这些方法抽象出来,其他步骤在子类实现
关键代码: 在抽象类实现,其他步骤在子类实现
框架体现:
- 在 Spring Security 中,
UserDetailsService
接口就是一个模板模式的应用。UserDetailsService
接口定义了一个算法的骨架,即loadUserByUsername
方法,用于从数据库中查询用户信息。具体的实现步骤则由子类来实现,即根据具体的业务需求,实现loadUserByUsername
方法来查询数据库中的用户信息,并将查询结果封装成UserDetails
对象返回。这个UserDetails
对象包含了用户的详细信息,如用户名、密码和权限等。因此,UserDetailsService
接口是一个模板模式的应用,它将一些复杂的查询逻辑封装在一个抽象类中,而将具体的查询实现步骤延迟到子类中实现。
示例:
假设我们要实现一个游戏,其中有两个角色:战士和法师。这两个角色都可以攻击敌人,但攻击方式不同。战士使用近战武器进行攻击,而法师使用远程魔法进行攻击。我们可以使用模板模式来实现这个游戏。首先,我们定义一个抽象类 Character
,其中包含一个 attack
方法,用于攻击敌人。这个 attack
方法是一个模板方法,其中包含了攻击的骨架,但具体的攻击方式是由子类来实现的。
1 | public abstract class Character { |
然后,我们定义两个子类 Warrior
和 Wizard
,分别表示战士和法师。这两个子类需要实现 selectWeapon
和 performAttack
方法,来选择武器和进行攻击。
1 | public class Warrior extends Character { |
最后,我们可以创建一个测试类,来测试这个游戏。
1 | public class GameTest { |
我们创建了一个战士和一个法师,并调用它们的 attack
方法来进行攻击。由于 attack
方法是一个模板方法,因此它们的攻击方式是不同的,战士使用近战武器进行攻击,而法师使用远程魔法进行攻击。这个例子展示了模板模式的应用,它将一些复杂流程的实现步骤封装在一个抽象类中,而将一些具体实现步骤延迟到子类中实现。
- Title: 模板模式
- Author: cccs7
- Created at: 2023-08-04 23:29:22
- Updated at: 2023-08-06 14:00:18
- Link: https://blog.cccs7.icu/2023/08/04/模板模式/
- License: This work is licensed under CC BY-NC-SA 4.0.