问题的引入——标准化考试
● 考试的例子中,考试题都是相同的,没人的解答可以不同
● 定义一个抽象类,将部分逻辑以具体方法以及具体子类的形式实现,然后声明一些抽象方法来破事子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
模板方法模板
结构图:
抽象模板角色有如下的责任:
1、定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做进本操作,它们是一个顶级逻辑的组成步骤。(TemplateMethod())
2、定义并实现了一个模板方法。(PrimitiveOperation())
代码实现:
abstract class AbstractClass
{
//一些抽象行为,放到子类中去实现
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
//模板方法,给出了逻辑的股价,而逻辑的组成是一些相应的抽象操作,他们都推迟到了子类实现
public void TemplateMethod()
{
PrimitiveOperation 1();
PrimitiveOperation 2();
System.out.println("");
}
}
class ConcreteClassA extends AbstractClass
{
public void PrimitiveOperation1()
{
System.out.println("具体类A方法1实现");
}
public void PrimitiveOperation2()
{
System.out.println("具体类A方法2实现");
}
}
客户端调用:
public class program{
public static void main(String[] args){
AbstractClass c;
c = new ConcreteClassA();
c.TemplateMethod();
c = new ConcreteClassB();
c.TemplateMethod();
}
}
模板方法模式特点:
● 模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势
● 提供了一个代码复用平台
优点:实现代码的复用
缺点:算法骨架不容易升级(模板和子类是非常耦合的,如果要变更模板中的算法骨架,会影响子类变化)