模板方法定义了一个操作中的算法的框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义改算法的某些特定步骤,算法的骨架是不变的,但其中的步骤实现可能有变化,这时可应用模板方法

场景

  • 有多个子类共有的方法,且逻辑相同
  • 重要的、复杂的方法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现

实现

  • AbsTemplate 抽象类,定义算法框架
  • ConcreteTemplateA、ConcreteTemplateB 具体的实现类

抽象了一个工作的例子

  1. public abstract class Work {
  2. public Work() {
  3. goToWork();
  4. goOffWork();
  5. sleep();
  6. }
  7. public abstract void goToWork();
  8. public abstract void work();
  9. public abstract void goOffWork();
  10. public abstract void sleep();
  11. }

实现具体的类

  1. public class XiaoMing extends Work {
  2. static final String TAG = XiaoMing.class.getSimpleName();
  3. @Override
  4. public void goToWork() {
  5. Log.d(TAG,"早上7点,去公安局上班");
  6. }
  7. @Override
  8. public void work() {
  9. Log.d(TAG,"处理案件");
  10. }
  11. @Override
  12. public void goOffWork() {
  13. Log.d(TAG,"下午6点,下班");
  14. }
  15. @Override
  16. public void sleep() {
  17. Log.d(TAG,"晚上10点,睡觉");
  18. }
  19. }
  20. public class XiaoDong extends Work{
  21. static final String TAG = XiaoDong.class.getSimpleName();
  22. @Override
  23. public void goToWork() {
  24. Log.d(TAG,"早上8点,去图书馆上班");
  25. }
  26. @Override
  27. public void work() {
  28. Log.d(TAG,"整理图书");
  29. }
  30. @Override
  31. public void goOffWork() {
  32. Log.d(TAG,"下午6点,下班");
  33. }
  34. @Override
  35. public void sleep() {
  36. Log.d(TAG,"晚上10点,睡觉");
  37. }
  38. }

我们可以清楚的看到,代码执行的流程都一样,根据模板来。goToWork-work-goOffWork-sleep这样一个顺序,子类无需改变这种架构,而可以实现自己的功能

优点

  • 封装不变部分,扩展可变部分
  • 提取公共代码,便于维护
  • 行为由父类控制,子类实现

缺点

  • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大
  • 增加代码阅读难度,有的时候变得不好理解

Android 中的应用

  • AsyncTask
  • Activity、Fragment

参考

技术文章:菜鸟教程-设计模式Android 模板方法模式