个人笔记,请不要被误导
模板方法模式:在一个方法中定义一个方法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
不同子类的相同方法在抽象父类里声明为final,防止子类修改。不同子类的不同方法在抽象父类声明为abstract,让子类去实现。还有一种子类可以选择实现或不实现,父类中既不声明abstract,也不声明final,父类给一个默认的函数,子类可以改写,称为“钩子”。
java API里的数组类的sort方法(它是一个静态方法)用组合(因为无法设计一个类继承java数组)的方式实现模板方法模式。sort()调用的mergeSort()是真正排序的算法。mergeSort()里只能对Comparable的对象进行排序。Comparable是个接口。假如想对节点排序(根据节点的值),就需要节点类实现Comparable接口,重写CompareTo()方法。
和其它模式的关系:
工厂模式是模板方法模式中的一种特殊版本。
策略模式是定义一个算法族,让这些算法可以替换。算法都被封装起来,客户可以轻易使用不同算法或者改变。
模板方法模式是定义一个算法大纲,而由子类定义其中某些步骤的内容。这样子类可以有不同的实现细节,但是算法结构不变。
public class Tea extends CaffeineBeverage { @Override public void brew() { System.out.print("brew tea"); } @Override public void addCondiments() { System.out.print("add lemon"); }}public class Coffee extends CaffeineBeverage { @Override public void brew() { System.out.print("Brew coffee"); } @Override public void addCondiments() { System.out.print("add suger"); }}public void TemplateMethodPattern(){ Tea tea = new Tea(); tea.prepareRecipe(); }public abstract class CaffeineBeverage { public final void prepareRecipe(){ boilWater(); pourInCup(); if (customerWantsCondimentsHook()) addCondiments();//如果钩中了,就调用相应方法 } public abstract void brew();//子类不同的方法设置为抽象,由子类实现 public abstract void addCondiments(); public final void boilWater(){}; public final void pourInCup(){}; public boolean customerWantsCondimentsHook(){return true;};//钩子可以让子类有能力对算法不同点进行挂钩 }
Collections.sort(intervals, new Comparator<Interval>() { @Override public int compare(Interval o1, Interval o2) { return o1.start - o2.start; } });