模板方法设计模式解读

简介: 模板方法设计模式解读

3d0357bbde8c482cb4e41af9c4df05e8.png

豆浆制作问题

编写制作豆浆的程序,说明如下:
1) 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎
2) 通过添加不同的配料,可以制作出不同口味的豆浆
3) 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
4) 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式 )

模板方法模式基本介绍

基本介绍

1) 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),z 在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
2) 简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
3) 这种类型的设计模式属于行为型模式。

模板方法模式的原理类图

对原理类图的说明-即(模板方法模式的角色及职责)
1) AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象方法 operationr2,3,4
2) ConcreteClass 实现抽象方法 operationr2,3,4, 以完成算法中特点子类的步骤

模板方法模式解决豆浆制作问题

应用实例要求

编写制作豆浆的程序,说明如下:
制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎
通过添加不同的配料,可以制作出不同口味的豆浆
选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。。)

思路分析和图解(类图)

SoyaMilk

1. public abstract class SoyaMilk {
2. 
3. final  void make(){
4.         select();
5.         addCondiments();
6.         soak();
7.         beat();
8.     }
9. 
10. void  select(){
11.         System.out.println("第一步选好材料");
12.     }
13. abstract  void  addCondiments();
14. 
15. void  soak(){
16.         System.out.println("第三步黄豆和配料开始浸泡,需要 3 小时");
17.     }
18. 
19. void  beat(){
20.         System.out.println("第四步黄豆和配料放到豆浆机去打碎");
21.     }
22. 
23. }

RedBeanSoyaMilk

1. public class RedBeanSoyaMilk extends  SoyaMilk{
2. @Override
3. void addCondiments() {
4.         System.out.println("加入好的红豆");
5.     }
6. }

PeanutSoyaMilk  

1. public class PeanutSoyaMilk  extends  SoyaMilk{
2. 
3. @Override
4. void addCondiments() {
5.         System.out.println(" 加入上好的花生 ");
6.     }
7. }

Client

1. public class Client {
2. public static void main(String[] args) {
3.         System.out.println("----制作红豆豆浆----");
4. SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
5.         redBeanSoyaMilk.make();
6.         System.out.println("----制作花生豆浆----");
7. SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
8.         peanutSoyaMilk.make();
9.     }
10. }

模板方法模式的钩子方法

1) 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
2) 还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造

1. public abstract class SoyaMilk {
2. 
3. final  void make(){
4.         select();
5. if (customerWantCondiments()){
6.             addCondiments();
7.         }
8.         soak();
9.         beat();
10.     }
11. 
12. boolean customerWantCondiments() {
13. return true;
14.     }
15. 
16. void  select(){
17.         System.out.println("第一步选好材料");
18.     }
19. abstract  void  addCondiments();
20. 
21. void  soak(){
22.         System.out.println("第三步黄豆和配料开始浸泡,需要 3 小时");
23.     }
24. 
25. void  beat(){
26.         System.out.println("第四步黄豆和配料放到豆浆机去打碎");
27.     }
28. 
29. }

PureSoyaMilk  

1. public class PureSoyaMilk extends SoyaMilk{
2. 
3. @Override
4. void addCondiments() {
5. 
6.     }
7. 
8. @Override
9. boolean customerWantCondiments() {
10. return false;
11.     }
12. }

模板方法模式的注意事项和细节

1) 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
2) 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
3) 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
4) 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
5) 一般模板方法都加上 final 关键字, 防止子类重写模板方法.
6) 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理

相关文章
|
设计模式 算法 Java
模板方法设计模式(TemplateMethod)
模板方法设计模式(TemplateMethod)
|
设计模式 算法 Java
模板方法--设计模式
模板方法--设计模式
90 0
|
设计模式 算法 Java
设计模式系列教程(08) - 模板方法
设计模式系列教程(08) - 模板方法
84 0
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
276 1
|
设计模式 SQL 数据库
淘东电商项目(61) -聚合支付(基于模板方法设计模式管理支付回调)
淘东电商项目(61) -聚合支付(基于模板方法设计模式管理支付回调)
150 0
|
设计模式 算法
模板方法-大话设计模式
模板方法-大话设计模式
|
设计模式 存储 Java
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
78 0
|
设计模式 算法 Java
【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)
【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)
|
设计模式 算法
设计模式之模板方法
设计模式之模板方法
|
设计模式 SQL 数据库
淘东电商项目(62) -聚合支付(基于模板方法设计模式管理支付回调-支付宝)
淘东电商项目(62) -聚合支付(基于模板方法设计模式管理支付回调-支付宝)
110 0