模板模式

cccs7 Lv5

模板模式是一种行为型设计模式,它定义了一个算法的骨架,将一些复杂流程的实现步骤封装在一个抽象类中,而将一些具体实现步骤延迟到子类中实现。

在 模板模式(Template Pattern)中,一个抽象类公开定义了 执行它的方法的 方式/模板 。它的子类可以按需重写方法实现,但调用将以 抽象类中定义的 方式进行,这种类型的设计模式属于 行为式模式

意图: 定义一个 操作中的算法的骨架,而将一些步骤 延迟到子类中。 模板方法使得子类可以不改变一个算法的 结构即可 重定义该算法某些特定的 步骤

主要解决: 一些方法通用,却在每一个子类都 重新写了这一个方法

何时使用: 有一些通用的方法

如何解决: 将这些方法抽象出来,其他步骤在子类实现

关键代码: 在抽象类实现,其他步骤在子类实现

框架体现

  1. 在 Spring Security 中,UserDetailsService 接口就是一个模板模式的应用。UserDetailsService 接口定义了一个算法的骨架,即 loadUserByUsername 方法,用于从数据库中查询用户信息。具体的实现步骤则由子类来实现,即根据具体的业务需求,实现 loadUserByUsername 方法来查询数据库中的用户信息,并将查询结果封装成 UserDetails 对象返回。这个 UserDetails 对象包含了用户的详细信息,如用户名、密码和权限等。因此,UserDetailsService 接口是一个模板模式的应用,它将一些复杂的查询逻辑封装在一个抽象类中,而将具体的查询实现步骤延迟到子类中实现。

示例:

假设我们要实现一个游戏,其中有两个角色:战士和法师。这两个角色都可以攻击敌人,但攻击方式不同。战士使用近战武器进行攻击,而法师使用远程魔法进行攻击。我们可以使用模板模式来实现这个游戏。首先,我们定义一个抽象类 Character,其中包含一个 attack 方法,用于攻击敌人。这个 attack 方法是一个模板方法,其中包含了攻击的骨架,但具体的攻击方式是由子类来实现的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class Character {
public void attack() {
// 选择武器
selectWeapon();
// 进行攻击
performAttack();
// 战斗结束
endBattle();
}

protected abstract void selectWeapon();

protected abstract void performAttack();

protected void endBattle() {
System.out.println("战斗结束");
}
}

然后,我们定义两个子类 WarriorWizard,分别表示战士和法师。这两个子类需要实现 selectWeaponperformAttack 方法,来选择武器和进行攻击。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Warrior extends Character {
@Override
protected void selectWeapon() {
System.out.println("选择近战武器");
}

@Override
protected void performAttack() {
System.out.println("使用近战武器攻击敌人");
}
}

public class Wizard extends Character {
@Override
protected void selectWeapon() {
System.out.println("选择远程魔法");
}

@Override
protected void performAttack() {
System.out.println("使用远程魔法攻击敌人");
}
}

最后,我们可以创建一个测试类,来测试这个游戏。

1
2
3
4
5
6
7
8
9
public class GameTest {
public static void main(String[] args) {
Character warrior = new Warrior();
warrior.attack();

Character wizard = new Wizard();
wizard.attack();
}
}

我们创建了一个战士和一个法师,并调用它们的 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.
 Comments
On this page
模板模式