首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解模板方法模式

理解模板方法模式
EN

Stack Overflow用户
提问于 2014-02-25 13:41:24
回答 3查看 1.3K关注 0票数 2

据我所知,模板方法只不过是调用子类中定义的虚拟或抽象方法的普通方法。我是对的,还是这个模式还有什么重要的东西我错过了?

代码语言:javascript
复制
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
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-25 13:48:00

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

模板方法的意思是,有时,您需要执行一些公共逻辑,并将一些子类特定的逻辑与它交织在一起。因此,您希望留给每个子类的特定逻辑被定义为一个抽象/虚拟方法,留给具体的类来实现,而普通的业务逻辑则围绕在它周围。

如果要确保公共逻辑不被覆盖,还可以标记模板方法不被重写(例如,在Java中使用final关键字),因此确保始终执行要执行的公共代码,同时允许子类覆盖您希望它覆盖的位。

把它想象成文档模板。标题、页脚和通用元素都是固定的,并且始终是相同的,然后是特定文档的具体细节,以填补中间的空白。

票数 10
EN

Stack Overflow用户

发布于 2014-02-25 13:52:41

模板模式为该方法的所有子级提供了一个公共序列跟踪。因此,模板模式定义了一个最后的方法,它告诉执行的顺序。

代码语言:javascript
复制
abstract class Foo {
    public void final initilialize(){
        method1();
        method2();
        method3();
    }
    public void method1(){...}
    public void method2(){...}
    public void method3(){...}
}

现在,子类可以扩展Foo类。引用可以创建为:

代码语言:javascript
复制
Foo obj1=new child();

有关更多信息,请查看pattern.htm

票数 2
EN

Stack Overflow用户

发布于 2021-09-30 19:10:48

HeadFirst书中的例子。

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

代码语言:javascript
复制
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");
    }

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

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

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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");
    }
}

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

代码语言:javascript
复制
public class CaffeineBeverageTest {
    public static void main(String[] args){
        Tea tea = new Tea();
        tea.prepareRecipe();

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

所以说-在里面创建抽象类和方法。对不同的行为采用抽象的方法,对普通的行为采用正常的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22015933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档