二十三种设计模式之模板方法模式
这是我写二十三种设计模式第二篇文章。这个系列我将持续写下去,欢迎大家关注,点赞和收藏。模板方法模式
1.模板方法模式(Template Method Pattern)又叫模板模式,在一个抽象的类中,公开定义了要执行的方法的模板。它的子类可以按照需要重写方法实现。但是调用将以抽象类中定义的方法进行。
2.简单的说,模板方法模式定义一个操作中的算法骨架,将进一步实现的步骤延迟到子类中,使得子类可以不改变一个算法的结构。就可以重定义该算法的某些特定的步骤。
3.这种类型的设计模式属于行为模式。
模板方法的UML图
1.AbstractClass 抽象类,类中事项模板方法,定义了算法骨架,具体需要子类去实现,其他的抽象方法operationr2,3,4
2.ConcreteClass 事项抽象方法operationr2,3,4
模板方法来实现豆浆只做问题
编写豆浆的程序,说明如下,制作豆浆的流程,选材 1.添加配料 2.浸泡 3放在豆浆机打碎添加不同的配料 可以制作各种口味的豆浆选材,浸泡和放在豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆,花生豆浆)
模板方法的例子代码实现
1.定义模板类/** * 抽象类表示豆浆 */ public abstract class SoyaMilk { //模板方法make ,一般设置成final ,不让子类去覆盖 final void make(){ select(); if (customerChoose()){ addCondiments(); } soak(); beat(); } //选材料 void select(){ System.out.println("第一步,选择大豆"); } //添加不同配料,抽象方法,具体有子类去实现 abstract void addCondiments(); //浸泡, void soak(){ System.out.println("第三步,黄豆和配料开始浸泡 ,需要3个小时"); } void beat(){ System.out.println("第四步 ,黄豆和配料打碎"); } }
定义子类public class RedBeanMilk extends SoyaMilk{ @Override void addCondiments() { System.out.println("加入上好的黄豆"); } }public class PeanutMilk extends SoyaMilk{ @Override void addCondiments() { System.out.println("添加上好的花生"); } }
调用方法。public class Client { public static void main(String[] args) { System.out.println("制作红豆豆浆"); SoyaMilk redBeanSoyaMilk = new RedBeanMilk(); redBeanSoyaMilk.make(); System.out.println("制作花生豆浆"); SoyaMilk peanutSoyaMilk = new PeanutMilk(); redBeanSoyaMilk.make(); } }模板方法模式的钩子方法
模板方法模式的钩子方法
1.在模板方法的父类中,我们可以定义一个方法,他默认可以不做任何事情,子类可以视情况要不要覆盖它,该方法称为钩子
2.还是以上面的制作豆浆的例子来讲解,我们需要制作纯豆浆,不添加任何配料,我们需要用钩子方法对前面的模板进行改造。
1.给抽象类添加钩子方法。/** * 抽象类表示豆浆 */ public abstract class SoyaMilk { //模板方法make ,一般设置成final ,不让子类去覆盖 final void make(){ select(); if (customerChoose()){ addCondiments(); } soak(); beat(); } //选材料 void select(){ System.out.println("第一步,选择大豆"); } //钩子方法 是否要添加配料 boolean customerChoose(){ return true; } //添加不同配料,抽象方法,具体有子类去实现 abstract void addCondiments(); //浸泡, void soak(){ System.out.println("第三步,黄豆和配料开始浸泡 ,需要3个小时"); } void beat(){ System.out.println("第四步 ,黄豆和配料打碎"); } }
子类覆盖钩子方法public class PurSoyaMilk extends SoyaMilk{ @Override boolean customerChoose() { return false; } @Override void addCondiments() { } }SoyaMilk puryMilk = new PurSoyaMilk(); puryMilk.make();
由此可以看出钩子方法,是返回一个布尔值,决定模板中某个方法要不要执行。
在springIOC中使用模板方法模式。有机会给这个文章深入剖析一下。
为什么阿里可以频繁的架构调整?(附CEO张勇公开信)11月26日,阿里巴巴集团CEO张勇一纸公开信打破周一市场的平静。阿里巴巴宣布组织架构调整,技术电商等多个核心业务高层变更阿里几乎每一年都会发起一次不小规模的组织架构调整,特别最近
今年秋季MacBookPro将迎来六大变化新款MacBookPro有望让Apple的旗舰笔记本电脑焕然一新,并为未来的发布奠定基础。让我们来看看我们可以在下一代MacBookPro中看到什么,以及这些新功能将如何将笔记本电
苹果电脑怎么查保修期查询?我相信很多朋友刚拥有Mac计算机或笔记本时,不知道自己机器的保修查询方法。macw小编现给大家带来了这个小入门技巧,请跟随小编观看此教程!我们可以到苹果的官方查询网输入序列号,即可
围观中,新的AppleWatch显示屏尺寸和外观早些时候,有媒体报道了即将发布的苹果手表系列7的新细节,包括更大的屏幕尺寸。此前,人们对下一代AppleWatch知之甚少,只知道它显然采用了让人想起iPhone12和iPadPr
如何彻底卸载不需要的Mac屏保想知道怎么删除Mac电脑屏保吗?该怎么删除不喜欢的屏保呢?可能很多新接触mac电脑的小伙伴不是很熟悉,本次小编为您带来几种彻底卸载Mac屏保的方法,想知道的小伙伴千万不要错过哦!欢
MacOS系统无法连接5gwifi的解决办法,你确定不来看看吗?MBP突然连不上5GWifi,但是用Wifi却可以,用手机平板使用5GWIFI一切正常,是什么问题呢?重启路由器重启电脑路由器刷机路由器恢复出厂设置,一番折腾下来,费时又费力,终于
Mac新手必看,这些设置可以让你的Mac更好用如果你刚买了一台新的Mac,不免要对Mac做一些设置,现为你提供一些Mac常用的设置技巧,让你的Mac更加好用。访达设置访达是我们在使用Mac时最常用的应用了,每次打开访达窗口,会
解锁Mac上自带的计算机的隐藏功能不要小看macOs的计算器App只要点按几下,你就能发现它简洁外表下潜藏着的强大功能。轻松转换想在人民币与美元公里与英里之间转换?只要输入一个数值,再在转换菜单中选择单位类别(面积
iphone13价格官网报价已有,快看是否超出预算目前距离Apple预计揭开新款iPhone13的面纱只有几周的时间,自然而然,越来越多的信息通过非官方渠道成为头条新闻。这一次,轮到iPhone13的价格上网了,因为一份报告显示了
新款MacBook带TouchBar如何开机和强制关机新款的MacBook前排的物理按键换成了TouchBar,虽然整体上没太大的变化,但是!但是!如果没有启动,连屏幕都显示不了啊,那怎么开机呢?开启Mac(开机)开启带有TouchB
如何在MacOSMonterey中使用实时文本在2021年6月的WWDC上,Apple在MacOSMonterey中宣布了一项名为LiveText的简洁新功能。这使您可以突出显示任何照片中的文本并以多种方式使用它。您可以复制和