模板方法模式:定义一个操作中的算法的框架,而将详细的步骤延迟到子类中。模板方法使得子类可以不改变算法的结构下重新定义算法的步骤。
模板方法模式 Template Pattern
一个算法可以明确分割为几个关键步骤,这几个步骤的顺序是固定的,但是每个步骤的实现会随环境的改变而变化,对于这类问题常用模板方法来解决。
类图结构
结构解析
AbstractClass
抽象类,定义一套算法框架 templateMethod
。
ConcreteClass
实现类,实现抽象方法,在同一个算法框架下,体现每个实现类的差异性。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| public abstract class AbstractClass { public abstract void privateOperation1(); public abstract void privateOperation2(); public abstract void privateOperation3();
public void templateMethod(){ System.out.println("AbstractClass: Game Start..."); privateOperation1(); privateOperation2(); privateOperation3(); } }
public class ConcreteClassA extends AbstractClass{
@Override public void privateOperation1() { System.out.println("ConcreteClassA, WangZheRongYao: log in."); }
@Override public void privateOperation2() { System.out.println("ConcreteClassA, WangZheRongYao: DaGuaiShengJi."); }
@Override public void privateOperation3() { System.out.println("ConcreteClassA, WangZheRongYao: log out."); } }
public class ConcreteClassB extends AbstractClass{
@Override public void privateOperation1() { System.out.println("ConcreteClassA, DouDiZhu: log in."); }
@Override public void privateOperation2() { System.out.println("ConcreteClassA, DouDiZhu: QiangDiZhu."); }
@Override public void privateOperation3() { System.out.println("ConcreteClassA, DouDiZhu: log out."); } }
public class TestTemplateMethod { public static void main(String[] args) { AbstractClass abstractClass = new ConcreteClassA(); abstractClass.templateMethod();
abstractClass = new ConcreteClassB(); abstractClass.templateMethod(); } }
AbstractClass: Game Start... ConcreteClassA, WangZheRongYao: log in. ConcreteClassA, WangZheRongYao: DaGuaiShengJi. ConcreteClassA, WangZheRongYao: log out. AbstractClass: Game Start... ConcreteClassA, DouDiZhu: log in. ConcreteClassA, DouDiZhu: QiangDiZhu. ConcreteClassA, DouDiZhu: log out.
|
总结
模板方法模式是把不变行为搬移到父类,去除子类的重复代码,帮助子类摆脱重复不变行为的纠缠。常见使用场景:
- 子类有共有方法,并且逻辑基本相同
- 用于代码重构,将公共方法抽取到父类中
在 Android
中,Activity/Fragmengt
等的生命周期是标准的模板方法,以及 AsyncTask
的执行步骤 onPreExecute --> doInBackgroud --> onPostExecute
等这些都是模板方法的体现。
参考文档
- 大话设计模式
Android
源码设计模式解析与实战