2

据我了解,模板方法只不过是调用子类中定义的虚拟或抽象方法的普通方法。我是对的,还是我错过了这种模式的其他重要内容?

abstract class Foo {
  public void IamTemplateMethod() { // which will be called in child class object
    method1(); // because this...
    method2(); // ...or this method was called in me
  }
  public virtual void method1() { ... } // to be overriden in child class
  public abstract void method2() { ... } // to be defined in child class
}

如果我是对的,还有其他常见的方法来实现 Template 方法吗?

4

3 回答 3

8

是的。大多数模式没有什么特别之处,只是看起来很适合某些情况的聪明方法,但仍然使用正常的 OO 原则(继承、多态性、抽象等)。

模板方法的意思是有时候,你需要做一些通用的逻辑,一些子类特定的逻辑与之交错。因此,您要为每个子类保留的特定逻辑被定义为一个抽象/虚拟方法,该方法留给具体类来实现,而通用业务逻辑则围绕它进行。

如果你想确保公共逻辑不被覆盖,你也可以将模板方法标记为不被覆盖(final例如Java中的关键字),这样你就可以确保你想要总是被执行的公共代码总是被强制执行,同时允许子类覆盖您想要的位。

把它想象成一个文档模板。标题、页脚和公共元素将固定在那里,并且始终相同,然后是特定文档用于填充中间空白的具体细节。

于 2014-02-25T13:48:00.180 回答
2

模板模式为该方法的所有子项提供了一个公共序列。所以模板模式定义了一个最终方法,它告诉执行顺序。

abstract class Foo {
    public void final initilialize(){
        method1();
        method2();
        method3();
    }
    public void method1(){...}
    public void method2(){...}
    public void method3(){...}
}

现在子类可以扩展 Foo 类。并且参考可以创建为:

Foo obj1=new child();

有关更多信息,请查看http://www.tutorialspoint.com/design_pattern/template_pattern.htm

于 2014-02-25T13:52:41.577 回答
0

HeadFirst 书中的示例。

你必须冲泡茶和咖啡。一般来说,它们都有相同的步骤,比如开水和倒入杯子,但它们也有一些不同的步骤,例如添加调味品——茶我们可以加柠檬,咖啡我们可以加牛奶。所以我们创建了一个CaffeineBeverage抽象的通用(模板)类:

public abstract class CaffeineBeverage {
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    abstract void brew();

    abstract void addCondiments();

    void boilWater() {
        System.out.println("Boiling water");
    }

    void pourInCup() {
        System.out.println("Pouring into cup");
    }

请注意,pourInCupandboilWater不是抽象的,因为它们对于茶和咖啡都是完全相同的。

现在我们创建Tea类来扩展我们的一般CaffeineBeverage类,并定义行为,例如添加调味品:

public class Tea extends CaffeineBeverage {
    @Override
    public void brew() {
        System.out.println("Steeping the tea");
    }

    @Override
    public void addCondiments() {
        System.out.println("Adding Lemon");
    }
}

Coffee类,它也扩展了CaffeineBeverage类:

public class Coffee extends CaffeineBeverage {
    @Override
    public void brew() {
        System.out.println("Dripping Coffee through filter");
    }

    @Override
    public void addCondiments() {
        System.out.println("Adding Sugar and Milk");
    }
}

我们可以为模板方法设计模式创建测试类:

public class CaffeineBeverageTest {
    public static void main(String[] args){
        Tea tea = new Tea();
        tea.prepareRecipe();

        Coffee coffee = new Coffee();
        coffee.prepareRecipe();
    }
}

如此说来 - 在里面创建抽象类和方法。对不同的行为使用抽象方法,对常见的行为使用带有 body 的普通方法。

于 2021-09-30T19:10:48.043 回答