Dotcpp  >  编程教程  >  行为型模式(Behavioral Patterns)  >  模板模式

模板模式

点击打开在线编译器,边学边练

模板模式的主要目的是定义一个算法的框架,将算法的具体实现延迟到子类中。通过使用模板模式,我们可以在不改变算法结构的情况下,通过重写部分步骤的方式来定制算法的特定行为。

在实际应用中,模板模式非常适用于实现算法的变体和算法的复用。通过定义一个模板方法,在这个方法中定义了算法的骨架,固定了算法的执行顺序和结构,并且通过抽象方法或者钩子方法来将可变部分留给子类实现。

模板模式

下面是一个简单的Java示例,展示了如何使用模板模式:

public abstract class AbstractClass {
    public final void templateMethod() {
        // 这里是算法的骨架,定义了算法的执行顺序和结构
        // 步骤1
        step1();
        // 步骤2
        step2();
        // 钩子方法,可选的具体实现,由子类决定是否覆盖
        if (hookMethod()) {
            // 步骤3
            step3();
        }
        // 步骤4
        step4();
    }
    protected abstract void step1();
    protected abstract void step2();
    protected boolean hookMethod() {
        return true;
    }
    protected abstract void step3();
    protected abstract void step4();
}
public class ConcreteClassA extends AbstractClass {
    @Override
    protected void step1() {
        System.out.println("ConcreteClassA: Step 1");
    }
    @Override
    protected void step2() {
        System.out.println("ConcreteClassA: Step 2");
    }
    @Override
    protected void step3() {
        System.out.println("ConcreteClassA: Step 3");
    }
    @Override
    protected void step4() {
        System.out.println("ConcreteClassA: Step 4");
    }
}
public class ConcreteClassB extends AbstractClass {
    @Override
    protected void step1() {
        System.out.println("ConcreteClassB: Step 1");
    }
    @Override
    protected void step2() {
        System.out.println("ConcreteClassB: Step 2");
    }
    @Override
    protected boolean hookMethod() {
        return false;
    }
    @Override
    protected void step3() {
        System.out.println("ConcreteClassB: Step 3");
    }
    @Override
    protected void step4() {
        System.out.println("ConcreteClassB: Step 4");
    }
}
public class TemplatePatternDemo {
    public static void main(String[] args) {
        AbstractClass templateA = new ConcreteClassA();
        System.out.println("Running ConcreteClassA:");
        templateA.templateMethod();
        System.out.println();
        AbstractClass templateB = new ConcreteClassB();
        System.out.println("Running ConcreteClassB:");
        templateB.templateMethod();
    }
}

在这个示例中,AbstractClass是模板类,它定义了算法的骨架,其中的templateMethod()是模板方法。步骤1、2、4是必须的,而步骤3是一个钩子方法,子类可以选择是否覆盖它。

ConcreteClassA和ConcreteClassB是具体的子类,它们分别实现了抽象方法step1、step2、step3、step4,并且覆盖了钩子方法hookMethod()。通过继承AbstractClass并实现具体的方法,它们定制了算法的具体行为。

在模板模式中,算法的骨架是固定的,但具体的实现可以根据需求定制。这种方式可以让算法的框架具备可复用性,同时也提供了灵活性,因为具体步骤的实现可以在子类中进行定制。


本文固定URL:https://www.dotcpp.com/course/1387

上一课:

策略模式

下一课:

访问者模式

Dotcpp在线编译      (登录可减少运行等待时间)