大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~

希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!!

加油吧!未来可期!!

本文将介绍java设计模式之模板方法模式

案例引入

豆浆制作问题:编写制作豆浆的程序,说明如下:

1) 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎

2) 通过添加不同的配料,可以制作出不同口味的豆浆

3) 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的

4) 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单,很容易就 想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式 )

模板方法模式基本介绍

1) 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),z 在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法 实现,但调用将以抽象类中定义的方式进行

2) 简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子 类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定 步骤

3) 这种类型的设计模式属于行为型模式。

模板方法模式的原理类图

对原理类图的说明-即(模板方法模式的角色及职责)

1) AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨 架,具体子类需要去实现 其它的抽象方法operationr2,3,4

2) ConcreteClass 实现抽象方法operationr2,3,4, 以完成算法中特点子类的步骤

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

1) 应用实例要求 编写制作豆浆的程序,说明如下:

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

2) 思路分析和图解(类图)

3) 代码实现

package template;/* <---这是包名
-*- coding:utf-8 -*-
作者:bob-coding
日期:2022年10月18日11:10
敲码百遍,其意多见!!冲冲冲!!!*/public class Template {public static void main(String[] args) {System.out.println("----制作红豆豆浆----");SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();redBeanSoyaMilk.make();System.out.println("----制作花生豆浆----");SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();peanutSoyaMilk.make();}
}class RedBeanSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {System.out.println(" 加入上好的红豆 ");}
}class PeanutSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {System.out.println(" 加入上好的花生 ");}
}//抽象类,表示豆浆
abstract class SoyaMilk {//模板方法, make , 模板方法可以做成final , 不让子类去覆盖.final void make() {select();addCondiments();soak();beat();}//选材料void select() {System.out.println("第一步:选择好的新鲜黄豆  ");}//添加不同的配料, 抽象方法, 子类具体实现abstract void addCondiments();//浸泡void soak() {System.out.println("第三步, 黄豆和配料开始浸泡, 需要3小时 ");}void beat() {System.out.println("第四步:黄豆和配料放到豆浆机去打碎  ");}
}

 模板方法模式的钩子方法

1) 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以 视情况要不要覆盖它,该方法称为“钩子”。

2) 使用上面做豆浆的例子,来使用钩子方法对前面的模板方法进行改造

3) 主要代码:

//钩子方法,决定是否需要添加配料
boolean customerWantCondiments() {return true;
}
@Override
boolean customerWantCondiments(){return false;
}
package template2;/* <---这是包名
-*- coding:utf-8 -*-
作者:bob-coding
日期:2022年10月18日11:40
敲码百遍,其意多见!!冲冲冲!!!*/public class Template {public static void main(String[] args) {System.out.println("----制作红豆豆浆----");SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();redBeanSoyaMilk.make();System.out.println("----制作花生豆浆----");SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();peanutSoyaMilk.make();System.out.println("----制作纯豆浆----");SoyaMilk pureSoyaMilk  = new PureSoyaMilk();pureSoyaMilk.make();}
}class PureSoyaMilk extends SoyaMilk{@Overridevoid addCondiments() {}@Overrideboolean customerWantCondiments(){return false;}
}class RedBeanSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {System.out.println(" 加入上好的红豆 ");}
}class PeanutSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {System.out.println(" 加入上好的花生 ");}
}//抽象类,表示豆浆
abstract class SoyaMilk {//模板方法, make , 模板方法可以做成final , 不让子类去覆盖.final void make() {select();addCondiments();soak();beat();}//选材料void select() {System.out.println("第一步:选择好的新鲜黄豆  ");}//添加不同的配料, 抽象方法, 子类具体实现abstract void addCondiments();//浸泡void soak() {System.out.println("第三步, 黄豆和配料开始浸泡, 需要3小时 ");}void beat() {System.out.println("第四步:黄豆和配料放到豆浆机去打碎  ");}//钩子方法,决定是否需要添加配料boolean customerWantCondiments() {return true;}
}

模板方法模式在Spring框架应用的源码分析

1) Spring IOC容器初始化时运用到的模板方法模式

2) 代码分析+角色分析+说明类图

 

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

1) 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算 法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改

2) 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接 使用。

3) 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不 变,同时由子类提供部分步骤的实现。

4) 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加, 使得系统更加庞大

5) 一般模板方法都加上final关键字, 防止子类重写模板方法.

6) 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一 系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模 式来处理.

Java设计模式之模板方法模式(UML类图分析+代码详解)相关推荐

  1. java设计模式之工厂模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  2. java设计模式之建造者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  3. Java设计模式之策略模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  4. Java设计模式之组合模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  5. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  6. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  7. Java设计模式之观察者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  8. uml类图设计系统详解实例

    UML 类图 2009-11-21 14:03        by         闫妍,         1098         阅读,         ...         评论,       ...

  9. UML类图-六种关系详解

    UML基本介绍 UML--Unified modeling language UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果 UML本身 ...

最新文章

  1. HTML基础笔记-02
  2. Live Writer测试
  3. Codeforces Round #585 (Div. 2) F. Radio Stations 2-sat + 神仙建模
  4. XStream的使用
  5. lisp 线性标注自动避让_本科阶段就挑战自动驾驶开发?华为云ModelArts说Yes!
  6. 来自android的大文件清理,还在一键清理手机垃圾教你删除这些空文件夹,释放超大内存...
  7. c语言 绝对值比较大小,c语言-求绝对值最大值
  8. Python-----并发,并行,进程,多进程
  9. Day9之深浅拷贝大法
  10. 课堂在线录屏:EV录屏软件配置设置
  11. 工作五年,一年内我靠这系列java面试宝典从13K到大厂30K
  12. Android Studio一直停留在MyApplication:syncing(解决方案)
  13. UMLChina建模竞赛第3赛季第8轮:交友辅助系统,赵雅芝
  14. 如何快速搜索电脑文件
  15. 一文入门大规模预训练语言模型丨“悟道之巅”公开课实录(1)
  16. 城市NOA赛道,这家“本土巨头”如何实现系统性能颠覆升级?
  17. mysql给用户重命名_MySQL如何修改用户名?(代码实例)
  18. Javascript(六十三)网络协议
  19. db2 load 快速_使用 DB2 的 LOAD FROM CURSOR 特性快速轻松地转移数据
  20. 计算机视觉方向期刊汇总

热门文章

  1. Debian10.9离线安装gcc(附离线包地址)
  2. BUUCTF warmup_csaw_2016 writeup
  3. 从零开始研发GPS接收机连载——10、位同步和帧同步
  4. redis客户端工具下载,RedisDesktopManager,RedisInsight
  5. 数控车椭圆编程实例带图_数控车床椭圆怎么编程
  6. 斗地主十句口诀技巧全解
  7. 如何启动mysql?
  8. 博一就完成了SCI论文发表要求是一种怎样的体验?
  9. FileReader读取文件
  10. DBC系列之使用CANdb++创建DBC(2)