分类: Java
2013-01-17 15:18:02
这篇博客主要用来讲述模板方法模式。模板模式是比较早的一种设计模式,在OO出现的时候,人们便想办法将共同代码提取出来,放到公共的部分,然后不同的部分分别在不同的子类中来实现,是基于继承代码复用的技术。
模板方法模式结构图:
模版方法模式关键点在于抽象父类。抽象父类在模板方法中规定了顶级逻辑,顶级逻辑由许多具体的方法来实现完成。在抽象父类中,规定好具体方法的接口参数,但并不给出其具体的实现。继承抽象父类的子类根据不同的需求再来实现各种具体的方法。就像做房子的总设计师一样,他只勾勒出整个房子的大体骨架,但是不给出这栋房子中每个房间怎么设计,房子内部结构的设计细节,这些工作就交给了下面具体设计师。具体设计师在总设计师已经完成设计的基础之上,然后完成剩下的房子内部细节设计。细节设计师不能违背或者修改总设计师的设计,只能在其基础之上进一步的细化设计,使之成为一个完整的房子设计图,最终付诸实施。
模版方法模式主要涉及到两个角色-抽象模板和具体模板。
抽象模板,定义了模式中顶级的逻辑操作,子类继承实现抽象模板中尚未实现的抽象方法。但是抽象模板中一般给出了顶级逻辑操作,而且会声明为final,子类不能覆写该顶级逻辑操作;
具体模板,继承抽象模版,具体实现抽象模板中声明的抽象方法。多个具体模版继承自抽象父类,按照不同的需求实现抽象父类中声明的抽象方法,按照顶级逻辑的执行顺序完成所需的功能。
本文将举一个简单的示例,是在实际中遇到的一个小问题。国密局制定的SM2算法标准是带ID的,但是在实际应用中,有些是不带ID,有些事带ID的,所以在某些情况下签名时需要带ID,但是有些情况签名又不需要带ID。
抽象模板:
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提倡多用组合少用继承,但是该模式是对继承的有效合理的利用,达到很好的设计效果。