模板方法模式

来源:互联网 发布:avast扫描慢 知乎 编辑:程序博客网 时间:2024/05/21 04:22


在定义功能时,功能的一部分是确定的,一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该类的子类去完成。
    抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
    具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。


eg: 计算某段程序的运行时间:

class GetTime{public final void getTime(){long start=System.currentTimeMilis();runcode();long end=System.currentTimeMilis();System.out.println("运行时间:"+(end-start))}public abstract void runcode();}class SubTime extends GetTime{public void runcode(){ ............. .............}}class Test{public static void main(String[] args){SubTime st=new SubTime();st.getTime();}}

该题中计算运行时间是固定的功能,而要运行的代码是不确定的。所以可以将要运行的代码封装成抽象方法,由子类去根据自己的需求来完成,而不希望被子类复写改变的getTime()方法可以用final关键字修饰一下。在该例子中,GetTime类是一个模板,用来完成不同的需求。


优点:
模板方法模式通过把不变的行为搬移到父类,去除了子类中的重复代码。
子类实现算法的某些细节,有助于算法的扩展。
通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。


适用场景:
在某些类的算法中,用了相同的方法,造成代码的重复。
控制子类扩展,子类必须遵守算法规则。

0 0