什么是模板模式?
模板模式,是一种行为设计模式,它允许在不改变算法结构的情况下,通过在一个抽象类中定义算法的骨架,将一些步骤延迟到子类中实现。
通俗的说,就是在一个模板中定义好一些方法,这些方法的实现过程可以在子类中实现,但是在模板中定义好的方法调用是不可更改的。
模板模式的优势
模板模式主要有三个优势:
- 代码复用性
- 扩展性
- 符合开闭原则
模板模式的核心是将相同的代码放在抽象类中,避免了代码的重复编写,提高了代码复用性。
由于在模板模式中,子类可以自由实现模板中的抽象方法,因此可以方便地扩展应用。
模板模式将不变的部分放在模板中实现,将变化的部分放在子类中实现,这样可以保证应用的可扩展性和可维护性,符合开闭原则。
模板模式的应用场景
模板模式常用于以下几种场景:
- 算法骨架固定,但是具体子步骤可以根据实际情况变化的情况。
- 多个类具有相同的方法,但是具体实现不同的情况。
- 需要在不同的情况下使用不同的实现方法的情况。
模板模式的实现
模板模式的实现需要定义一个抽象类,其中包含一个模板方法和一些抽象方法。
abstract class AbstractClass {
// 模板方法
public void templateMethod() {
// 实现代码
abstractMethod1();
abstractMethod2();
concreteMethod();
}
// 抽象方法
protected abstract void abstractMethod1();
protected abstract void abstractMethod2();
// 具体方法
protected void concreteMethod() {
// 实现代码
}
}
class ConcreteClass extends AbstractClass {
// 实现抽象方法1
protected void abstractMethod1() {
// 实现代码
}
// 实现抽象方法2
protected void abstractMethod2() {
// 实现代码
}
}
在上面的代码中,抽象类AbstractClass中包含了一个模板方法templateMethod和两个抽象方法abstractMethod1和abstractMethod2,其中abstractMethod1和abstractMethod2需要在子类中实现。
具体类ConcreteClass继承自抽象类AbstractClass,并实现了抽象方法abstractMethod1和abstractMethod2。
模板模式的实际应用
在实际开发中,模板模式可以用于很多场景。
游戏中的技能系统
在游戏中,技能系统是一个很重要的模块。不同的角色的技能不同,但是技能的使用方法是相同的。因此可以采用模板模式实现技能系统。
首先,定义一个抽象类Skill,其中包含一个模板方法useSkill和一个抽象方法doSkill。
abstract class Skill {
// 模板方法
public void useSkill() {
// 实现代码
doSkill();
// 实现代码
}
// 抽象方法
protected abstract void doSkill();
}
class FireBallSkill extends Skill {
// 实现抽象方法
protected void doSkill() {
// 实现代码
}
}
class ThunderSkill extends Skill {
// 实现抽象方法
protected void doSkill() {
// 实现代码
}
}
在上面的代码中,抽象类Skill中包含了一个模板方法useSkill和一个抽象方法doSkill,其中doSkill需要在子类中实现。

具体类FireBallSkill和ThunderSkill继承自抽象类Skill,并实现了抽象方法doSkill。
在游戏中,使用技能只需要调用useSkill方法即可:
Skill skill = new FireBallSkill(); skill.useSkill();
数据库操作
在数据库操作中,增删改查是常见的操作,但是具体的实现方式是不同的。因此可以采用模板模式实现数据库操作。
首先,定义一个抽象类AbstractDatabase,其中包含一个模板方法operate和四个抽象方法insert、delete、update和select。
abstract class AbstractDatabase {
// 模板方法
public void operate() {
// 实现代码
insert();
delete();
update();
select();
// 实现代码
}
// 抽象方法
protected abstract void insert();
protected abstract void delete();
protected abstract void update();
protected abstract void select();
}
class MysqlDatabase extends AbstractDatabase {
// 实现抽象方法insert
protected void insert() {
// 实现代码
}
// 实现抽象方法delete
protected void delete() {
// 实现代码
}
// 实现抽象方法update
protected void update() {
// 实现代码
}
// 实现抽象方法select
protected void select() {
// 实现代码
}
}
class OracleDatabase extends AbstractDatabase {
// 实现抽象方法insert
protected void insert() {
// 实现代码
}
// 实现抽象方法delete
protected void delete() {
// 实现代码
}
// 实现抽象方法update
protected void update() {
// 实现代码
}
// 实现抽象方法select
protected void select() {
// 实现代码
}
}
在上面的代码中,抽象类AbstractDatabase中包含了一个模板方法operate和四个抽象方法insert、delete、update和select,其中insert、delete、update和select需要在子类中实现。
具体类MysqlDatabase和OracleDatabase继承自抽象类AbstractDatabase,并实现了抽象方法insert、delete、update和select。
在实际使用中,可以根据需要选择具体的数据库操作类:
AbstractDatabase database = new MysqlDatabase(); database.operate();
总结
模板模式是一种非常有用的设计模式,它可以提高代码的复用性和可维护性,同时也符合开闭原则。在实际开发中,可以根据需要选择不同的实现方式,以便更好地提高代码质量和开发效率。
烽烟博客