模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。

打开网易新闻 查看精彩图片

在模板方法模式中,一个抽象类定义了一个模板方法,该方法中包含了算法的主要逻辑和步骤的顺序,同时也可以定义一些默认实现或者使用关键字"abstract"声明一些抽象方法,这些抽象方法的具体实现由子类来完成。
使用模板方法模式的场景通常是在一个算法中有固定的步骤和变化的细节时。通过将这些固定的步骤封装在父类的模板方法中,子类可以根据实际需求来实现对应的细节。
示例代码:
首先,定义一个抽象类(AbstractClass),该类中包含一个模板方法(templateMethod)和多个抽象方法(primitiveOperation):
public abstract class AbstractClass {
public void templateMethod() {
// 步骤1
step1();
// 步骤2
step2();
// 步骤3
step3();
}
public abstract void step1();
public abstract void step2();
public abstract void step3();
}
然后,实现两个具体的子类,分别是ConcreteClassA和ConcreteClassB,它们继承了AbstractClass并实现了其中的抽象方法:
public class ConcreteClassA extends AbstractClass {
@Override
public void step1() {
System.out.println("ConcreteClassA 的步骤1");
}
@Override
public void step2() {
System.out.println("ConcreteClassA 的步骤2");
}
@Override
public void step3() {
System.out.println("ConcreteClassA 的步骤3");
}
}
public class ConcreteClassB extends AbstractClass {
@Override
public void step1() {
System.out.println("ConcreteClassB 的步骤1");
}
@Override
public void step2() {
System.out.println("ConcreteClassB 的步骤2");
}
@Override
public void step3() {
System.out.println("ConcreteClassB 的步骤3");
}
}
客户端使用模板方法模式创建具体子类的实例,然后调用模板方法来执行算法:
public class Main {
public static void main(String[] args) {
AbstractClass classA = new ConcreteClassA();
classA.templateMethod();
AbstractClass classB = new ConcreteClassB();
classB.templateMethod();
}
}
运行结果:
ConcreteClassA 的步骤1
ConcreteClassA 的步骤2
ConcreteClassA 的步骤3
ConcreteClassB 的步骤1
ConcreteClassB 的步骤2
ConcreteClassB 的步骤3
模板方法模式适用于以下场景:
1. 当有一个算法的骨架,但其中的某些步骤的具体实现可能有所不同时,可以使用模板方法模式。通过将不同的实现延迟到子类中,可以实现代码的复用和扩展。
2. 当需要控制算法的执行顺序,但又希望子类能够灵活地改变其中某些步骤时,可以考虑使用模板方法模式。通过在抽象类中定义模板方法,并将某些步骤声明为抽象方法,可以保证算法的逻辑一致性,同时提供灵活性。
模板方法模式的优点包括:
1. 提高了代码的复用性,将公共的代码放在父类的模板方法中,子类只需要实现特定的步骤。
2. 提高了代码的可扩展性,通过继承抽象类,可以增加新的子类来改变算法的某些实现细节。
总结:
模板方法模式是一种简单但非常实用的设计模式,它提供了一种定义算法框架的方式,并允许子类在不改变算法结构的情况下重新定义算法的细节。在实际开发中,我们可以根据具体的业务逻辑和需求来决定是否使用模板方法模式,以提高代码的灵活性和可维护性。