2014-02-25 46 views
2

从我所了解的来看,Template方法只不过是调用子类中定义的虚拟或抽象方法的普通方法。我是对的吗,还是对于这种我怀念的模式还有其他重要的东西?了解模板方法模式

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 
} 

如果我是正确的,在那里实现模板方法,任何其他常见的方式?

回答

6

是的。大多数模式并没有什么特别之处,但只是巧妙的方法,似乎很适合某些情况,但仍然使用正常的面向对象原则(继承,多态,抽象等)。

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

如果您想确保通用逻辑没有被覆盖,您还可以标记模板方法不被覆盖(例如,使用Java中的final关键字),以确保您想要的通用代码始终执行始终是强制执行的,同时允许子类覆盖您想要的位。

认为它像一个文档模板。标题,页脚和常用元素将在那里固定并始终保持不变,然后详细说明特定文档用于填充两者之间的空白。

+0

啊 - 我终于明白,为什么使用'final'关键字,谢谢! :-) –

+0

酷:)。你也可以在类中使用它(不允许任何人重写它们)和变量(在这种情况下,它们的值一旦被初始化就不允许改变,它们将是不可变的) – jbx

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

+0

这是一个Template方法模式吗? method1() - method3()不是虚拟的或抽象的,所以调用initialize()不会从子类调用这些方法? –

+0

啊,我看到:所有方法都可以被重写的Java语法。 –

+0

yups ..所以你可以强制执行方法在java中以指定的顺序执行。 – Prateek