Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 理解模板方法模式_Design Patterns_Template Method Pattern - Fatal编程技术网

Design patterns 理解模板方法模式

Design patterns 理解模板方法模式,design-patterns,template-method-pattern,Design Patterns,Template Method Pattern,据我所知,模板方法只不过是调用子类中定义的虚方法或抽象方法的普通方法。我是对的,还是我错过了这个模式的其他重要方面 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

据我所知,模板方法只不过是调用子类中定义的虚方法或抽象方法的普通方法。我是对的,还是我错过了这个模式的其他重要方面

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
}

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

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

模板方法的意思是,有时,您需要执行一些公共逻辑,其中一些特定于子类的逻辑与之交错。因此,您希望为每个子类保留的特定逻辑被定义为一个抽象/虚拟方法,该方法留给具体类来实现,而公共业务逻辑围绕着它

如果要确保公共逻辑未被重写,还可以将模板方法标记为不被重写(例如,使用Java中的
final
关键字),以便确保始终强制执行要始终执行的公共代码,同时允许子类重写希望它执行的位


将其视为文档模板。标题、页脚和公共元素将固定不变,然后特定文档用于填充中间空白的具体细节。

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

abstract class Foo {
    public void final initilialize(){
        method1();
        method2();
        method3();
    }
    public void method1(){...}
    public void method2(){...}
    public void method3(){...}
}
现在子类可以扩展Foo类。可将引用创建为:

Foo obj1=new child();

有关更多信息,请查看

ah-我终于明白为什么要使用
final
关键字,谢谢!:-)酷:)。您还可以将它用于类(不允许任何人重写它们)和变量(在这种情况下,一旦初始化它们,它们的值将不允许更改,它们将是不可变的)当method1()-method3()不是虚拟或抽象时,这仍然是一个模板方法模式,所以调用initialize()不会从子类调用这些方法吗?啊,我明白了:Java语法,所有方法都可以被重写。是的。。因此,您可以在java中强制执行按指定顺序执行的方法。