模板模式在父类中定义了一个方法的模板,而子类可以动态的实现模板成分方法,但是模板中的方法顺序无法改变.
父类中的模板方法往往申明为final,用来保证方法不被子类覆盖,因为作为模板,是不可以改变的,但是模板方法内的一系列方法,可以由子类自己静态实现,同时在父类的模板方法中,可以定义钩子(hook)方法.方便子类对于模板方法的优化.下面用两个例子说明.
/*没有钩子(hook)的模板方法,此时模板方法无法修改*/ public abstract class Model { public final void eat()/*模板方法*/ { prepareFood(); cookFood(); eatFood(); } public abstract void prepareFood();//交给子类去实现的方法 public abstract void cookFood();//交给子类去实现的方法 public abstract void eatFood();//交给子类去实现的方法 } class Girl extends Model { /*子类实现玩需要实现的方法后,模板方法即可调用,完成操作*/ @Override public void prepareFood() { System.out.println("女生在准备饭菜!"); } @Override public void cookFood() { System.out.println("女生在做饭!"); } @Override public void eatFood() { System.out.println("女生在吃饭!"); } }
/*有钩子(hook)的模板方法,此时模板可以由子类自由修改*/ public abstract class Model { public final void eat()/*模板方法*/ { prepareFood(); if(hook()) cookFood(); eatFood(); } public boolean hook() { return true; } public abstract void prepareFood();//交给子类去实现的方法 public abstract void cookFood();//交给子类去实现的方法 public abstract void eatFood();//交给子类去实现的方法 } class Girl extends Model { /*子类实现玩需要实现的方法后,模板方法即可调用,完成操作*/ @Override public void prepareFood() { System.out.println("女生在准备方便面!"); } @Override public void cookFood() { System.out.println(""); } @Override public void eatFood() { System.out.println("女生在吃方便面!"); } public boolean hook()/*此方法在子类中返回为false后,cook方法将 无法调用,因此改变了模板方法,这类方法又称为"钩子",可以改变模板方法.*/ { return false; } }