据我所知,模板方法只不过是调用子类中定义的虚拟或抽象方法的普通方法。我是对的,还是这个模式还有什么重要的东西我错过了?
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
}如果我是对的,还有其他常见的方法来实现模板方法吗?
发布于 2014-02-25 13:48:00
是。大多数模式没有什么特别之处,只是一些看起来很适合某些情况的智能方法,但仍然使用正常的OO原则(继承、多态、抽象等)。
模板方法的意思是,有时,您需要执行一些公共逻辑,并将一些子类特定的逻辑与它交织在一起。因此,您希望留给每个子类的特定逻辑被定义为一个抽象/虚拟方法,留给具体的类来实现,而普通的业务逻辑则围绕在它周围。
如果要确保公共逻辑不被覆盖,还可以标记模板方法不被重写(例如,在Java中使用final关键字),因此确保始终执行要执行的公共代码,同时允许子类覆盖您希望它覆盖的位。
把它想象成文档模板。标题、页脚和通用元素都是固定的,并且始终是相同的,然后是特定文档的具体细节,以填补中间的空白。
发布于 2014-02-25 13:52:41
模板模式为该方法的所有子级提供了一个公共序列跟踪。因此,模板模式定义了一个最后的方法,它告诉执行的顺序。
abstract class Foo {
public void final initilialize(){
method1();
method2();
method3();
}
public void method1(){...}
public void method2(){...}
public void method3(){...}
}现在,子类可以扩展Foo类。引用可以创建为:
Foo obj1=new child();有关更多信息,请查看pattern.htm
发布于 2021-09-30 19:10:48
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");
}注意,pourInCup和boilWater并不是抽象的,因为它们对于茶和咖啡都是完全相同的。
现在,我们创建了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();
}
}所以说-在里面创建抽象类和方法。对不同的行为采用抽象的方法,对普通的行为采用正常的方法。
https://stackoverflow.com/questions/22015933
复制相似问题