—-慢慢来比较快,虚心学技术—-

概念

模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤

定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。

具体类似于将类中固定不变的内容作为一个方法的主体,而变化的部分相当于一个占位符,由子类提供的方法

推演

需求**:描述学校中我们一天的生活,我们在学校基本一致的内容是**

反例

  1. //小明的一天
  2. System.out.println("起床");
  3. System.out.println("去教室");
  4. System.out.println("上课");
  5. System.out.println("玩手指");
  6. System.out.println("下课");
  7. //小熊的一天
  8. System.out.println("起床");
  9. System.out.println("去教室");
  10. System.out.println("上课");
  11. System.out.println("玩脚趾");
  12. System.out.println("下课");
  13. //小敏的一天
  14. System.out.println("起床");
  15. System.out.println("去教室");
  16. System.out.println("上课");
  17. System.out.println("玩头发");
  18. System.out.println("下课");

正例(模板方法模式)

抽离独有模块,共享共同部分

  1. abstract class Daily{
  2. public void template(){
  3. getUp();
  4. enterTheClassroom();
  5. startLessons();
  6. //独有内容
  7. myDaily();
  8. endLessons();
  9. }
  10. public void getUp(){
  11. System.out.println("起床");
  12. }
  13. public void enterTheClassroom(){
  14. System.out.println("去教室");
  15. }
  16. public void startLessons(){
  17. System.out.println("上课");
  18. }
  19. public void endLessons(){
  20. System.out.println("下课");
  21. }
  22. abstract void myDaily();
  23. }
  24. class XiaoMing extends Daily{
  25. @Override
  26. void myDaily() {
  27. System.out.println("玩手指");
  28. }
  29. }
  30. class XiaoXiong extends Daily{
  31. @Override
  32. void myDaily() {
  33. System.out.println("玩脚趾");
  34. }
  35. }
  36. class XiaoMin extends Daily{
  37. @Override
  38. void myDaily() {
  39. System.out.println("玩头发");
  40. }
  41. }

应用场景

算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
**

优点

封装相同部分,扩展不同部分
**

缺点

子类定义数量过多,可能导致类爆炸,设计更加复杂

如有贻误,还请评论指正**