模版方法模式关键点在于抽象父类。抽象父类在模板方法中规定了顶级逻辑,顶级逻辑由许多具体的方法来实现完成。
在抽象父类中,规定好具体方法的接口参数,但并不给出其具体的实现。
继承抽象父类的子类根据不同的需求再来实现各种具体的方法。
就像做房子的总设计师一样,他只勾勒出整个房子的大体骨架,
但是不给出这栋房子中每个房间怎么设计,房子内部结构的设计细节,这些工作就交给了下面具体设计师。
具体设计师在总设计师已经完成设计的基础之上,然后完成剩下的房子内部细节设计。
细节设计师不能违背或者修改总设计师的设计,只能在其基础之上进一步的细化设计,使之成为一个完整的房子设计图,最终付诸实施。
模版方法模式主要涉及到两个角色-抽象模板和具体模板。
抽象模板,定义了模式中顶级的逻辑操作,子类继承实现抽象模板中尚未实现的抽象方法。但是抽象模板中一般给出了顶级逻辑操作,而且会声明为final,子类不能覆写该顶级逻辑操作;
具体模板,继承抽象模版,具体实现抽象模板中声明的抽象方法。多个具体模版继承自抽象父类,按照不同的需求实现抽象父类中声明的抽象方法,按照顶级逻辑的执行顺序完成所需的功能。
__________________________________________________________________
抽象模板:
public abstract class AbstractTemplate {
public void Sign(){
hash();
signature();
}
public abstract void hash();
public void signature(){};
public void hook(){};
}
__________________________________________________________________
具体模板:
public class ConcreteTemplate extends AbstractTemplate {
public void hash() {
//with ID
}
}
__________________________________________________________________
具体模板:
public class ConcreteTemplate2 extends AbstractTemplate{
public void hash(){
//without id
}
}
具体模板继承自抽象的模板,将抽象模板中的抽象方法按照不同的需求来实现(带ID的哈希和不带ID的哈希)。然后按照顶级逻辑中的计算步骤,对哈希值进行签名,完成整个计算过程。
模板方法模式使用的继承机制。虽然OO提倡多用组合少用继承,但是该模式是对继承的有效合理的利用,达到很好的设计效果。 |