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

| package com.atguigu.template; |
| |
| public abstract class SoyaMilk { |
| |
| |
| 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("第四步:黄豆和配料放到豆浆机去打碎 "); |
| } |
| } |
| |
| package com.atguigu.template; |
| public class PeanutSoyaMilk extends SoyaMilk { |
| @Override |
| void addCondiments() { |
| |
| System.out.println(" 加入上好的花生 "); |
| } |
| } |
| |
| package com.atguigu.template; |
| public class RedBeanSoyaMilk extends SoyaMilk { |
| @Override |
| void addCondiments() { |
| |
| System.out.println(" 加入上好的红豆 "); |
| } |
| } |
| |
| package com.atguigu.template; |
| |
| 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(); |
| } |
| |
| } |
| 1) 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。 |
| 2) 还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造 |
| package com.atguigu.template.improve; |
| |
| public abstract class SoyaMilk { |
| |
| |
| 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; |
| } |
| } |
| |
| package com.atguigu.template.improve; |
| public class PeanutSoyaMilk extends SoyaMilk { |
| @Override |
| void addCondiments() { |
| |
| System.out.println(" 加入上好的花生 "); |
| } |
| } |
| |
| package com.atguigu.template.improve; |
| public class RedBeanSoyaMilk extends SoyaMilk { |
| @Override |
| void addCondiments() { |
| |
| System.out.println(" 加入上好的红豆 "); |
| } |
| } |
| |
| package com.atguigu.template.improve; |
| public class PureSoyaMilk extends SoyaMilk{ |
| |
| @Override |
| void addCondiments() { |
| |
| |
| } |
| |
| @Override |
| boolean customerWantCondiments() { |
| |
| return false; |
| } |
| |
| } |
| |
| package com.atguigu.template.improve; |
| 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(); |
| System.out.println("----制作纯豆浆----"); |
| SoyaMilk pureSoyaMilk = new PureSoyaMilk(); |
| pureSoyaMilk.make(); |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
2021-08-31 vue开发:前端项目模板