Java 模板模式
模板模式:封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现
模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
重点内容
模板设计类,里面包含三种设计方法。
第一种是:继承父类中的抽象方法。 eg:addCondiments() 具体的实现方法,去有子类,重写完成。
第二种是: 带有Hook,称之为 ,带有钩子的方法。wantCondimentsHook(),其思想是 ,子类实现这个模板的 这个方法之前加以判断,是否完全继承 父类的这个方法。 不是,就自己另外重写。 具有很强的灵活性。
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if(wantCondimentsHook())
{
addCondiments();
}else{
System.out.println(“No Condiments”);
}
}
public boolean wantCondimentsHook()
{
return true;
}
public final void boilWater() {
System.out.println("Boiling water");
}
public abstract void brew();
public final void pourInCup() {
System.out.println("Pouring into cup");
}
public abstract void addCondiments();
templateMethod(): 抽象类 模板里面的方法执行顺序。
eg: prepareRecipe() 这个 方法里面加载 具体实现类 预加载执行的方法:
public void prepareRecipe() {
boilWater();
brewCoffee();
pourInCup();
addSugarMilk();
}
带有钩子hook 执行方法 :
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if(wantCondimentsHook())
{
addCondiments();
}else{
System.out.println(“No Condiments”);
}
}
public boolean wantCondimentsHook()
{
return true;
}
public final void boilWater() {
System.out.println("Boiling water");
}
public abstract void brew();
public final void pourInCup() {
System.out.println("Pouring into cup");
}
public abstract void addCondiments();
在子类 里面 重写 带有hook() 的方法,来改变原有的方法。 eg:
@Override
public boolean wantCondimentsHook()
{
System.out.println("Condiments,yes or no?please input(y/n):");
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String result="";
try {
result=in.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(result.equals("n"))
{
return false;
}
return true;
}