Java设计模式 12-模版模式

news/2024/11/23 16:52:09/

模板模式

一、豆浆制作问题

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

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

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

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

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

二、模板方法模式基本介绍

基本介绍

1)模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),

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

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

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

三、模板方法模式原理类图

1、 模板方法模式的原理类图

image-20210702204604691

  • 对原理类图的说明-即(模板方法模式的角色及职责)
  1. AbstractClass 抽象类:

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

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

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

1)应用实例要求

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

制作豆浆的流程 选材—>添加配料(每个种类的配料材料不一样)—>浸泡—>放到豆浆机打碎通过添加不同的配料,可以制作出不同口味的豆浆

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

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

image-20210702210829214

3)代码实现

主函数

public class Client {public static void main(String[] args) {//制作红豆豆浆System.out.println("----制作红豆豆浆----");SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk(); redBeanSoyaMilk.make();System.out.println("---- 制 作 花 生 豆 浆 ----"); SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk(); peanutSoyaMilk.make();}
}

PeanutSoyaMilk

public class PeanutSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {System.out.println(" 加入上好的花生 ");}
}

RedBeanSoyaMilk

public class RedBeanSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {System.out.println(" 加入上好的红豆 ");}
}

SoyaMilk抽象类

//抽象类,表示豆浆
public 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)还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造

  • 代码
//抽象类,表示豆浆
public abstract class SoyaMilk {//模板方法, make//模板方法可以做成 final , 不让子类去覆盖. final void make() {select(); if(customerWantCondiments()) {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;}
}

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

1)基本思想

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

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

3)既统一了算法,也提供了很大的灵活性

父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。

4)该模式的不足之处:

每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大

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

6)模板方法模式使用场景:

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


http://www.ppmy.cn/news/63669.html

相关文章

【深入理解redis】数据结构

文章目录 动态字符串SDS字符串编码类型 intsetDictZipListZipList的连锁更新问题 QuickListSkipListRedisObjectStringListSet结构ZSETHash Redis 共有 5 种基本数据结构:String(字符串)、List(列表)、Set(…

java获取resources路径的方法

我们在写程序的时候,有时候会发现代码不能正常运行,出现提示异常的问题,这就说明我们的代码没有执行完,也就是没有 resource,其实遇到这种情况,我们只需要把代码重新执行一遍即可。 在 java中是可以实现 re…

ISO 14229、ISO 15765、ISO 11898的区别

ISO 14229、ISO 15765、ISO 11898的区别 浅析ISO 14229、ISO 15765、ISO 11898协议的区别 ISO 14229、ISO 15765、ISO 11898的区别一、前言二、ISO 11898三、ISO 14229四、ISO 15765五、ISO 26262六、ISO 27145-4**总结:ISO 14229、ISO 15765 和 ISO 11898的区别&am…

asp.net+c#操作系统课程在线教学平台

1.系统登录:系统登录是用户访问系统的路口,设计了系统登录界面,包括用户名、密码和验证码,然后对登录进来的用户判断身份信息,判断是管理员用户还是普通用户。 2.系统用户管理:不管是…

Python每日一练(20230510) 石子游戏 VII\VIII\IX

目录 1. 石子游戏 Stone Game VII 2. 石子游戏 Stone Game VIII 3. 石子游戏 Stone Game IX 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 石子游戏 Stone Game VII 石子游戏中&…

mysql 排名与排序

MySQL 8.0 版本新增 两个排名函数 分别是 ROW_NUMBER() 与 RANK() 用法 SELECT ROW_NUMBER() OVER(ORDER BY id) AS rowNo, name FROM users; SELECT RANK() OVER(ORDER BY score DESC) AS rankNo, name, score FROM students;后面跟 OVER()括号里…

更懂业务的数智平台,应对数智化转型的“千变万化”

本文作者 跨界的申斯基 毫无疑问,随着数智化转型的加速,越来越多的企业正在把数智化战略提升到一个全新的高度,转型的进程也正从“浅层次”的数智化走向“深层次”数智化的阶段。 这也让企业的数智化转型进入到了一个全新的阶段,…

序列号及序列号生成器(号段模式,数据库模式)详细介绍(建议收藏)

前言 现如今,数据的唯一性和可追溯性变得越来越重要。从简单的数据库主键到复杂的分布式系统,唯一标识符在各种场景中都发挥着关键作用。序列号,作为一种广泛应用的唯一标识符,为我们提供了确保数据完整性和一致性的基础。在这个…