模板方法模式通过抽象类定义算法骨架,子类实现具体步骤。父类中final的模板方法固定流程,包含抽象方法、具体方法和钩子方法,如Beverage类的prepare()方法。子类Coffee和Tea实现brew()和addCondiments(),可选覆盖钩子customerWantsCondiments()。客户端调用prepare()即可按统一流程执行,输出咖啡和茶的制作过程,体现代码复用与扩展性。

在Java中,模板方法模式通过抽象类定义算法的骨架,把具体实现延迟到子类。这种方式既能复用代码,又能保持灵活性。核心是父类中定义一个final的模板方法,内部调用多个抽象或可重写的方法,由子类提供具体行为。
定义抽象类和模板方法
创建一个抽象类,在其中声明一个final的模板方法,防止被子类修改流程。模板方法中包含算法的步骤,这些步骤可以是抽象方法、具体方法或钩子方法。
例如,定义一个制作饮品的过程:
abstract class Beverage { // 模板方法:定义固定流程 public final void prepare() { boilWater(); brew(); pourInCup(); if (customerWantsCondiments()) { // 钩子方法控制流程 addCondiments(); } } // 具体方法(所有子类通用) private void boilWater() { System.out.println("烧开水"); } private void pourInCup() { System.out.println("倒入杯中"); } // 抽象方法:由子类实现 abstract void brew(); abstract void addCondiments(); // 钩子方法:默认不执行,子类可选择性覆盖 boolean customerWantsCondiments() { return true; }}
子类实现具体步骤
子类继承抽象类并实现抽象方法,从而定制特定行为。模板方法本身的执行顺序不变,但每一步的具体内容可以不同。
立即学习“Java免费学习笔记(深入)”;
在Android
本文档主要讲述的是在Android-Studio中导入Vitamio框架;介绍了如何将Vitamio框架以Module的形式添加到自己的项目中使用,这个方法也适合导入其他模块实现步骤。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
0 查看详情
比如制作咖啡和茶:
class Coffee extends Beverage { void brew() { System.out.println("用沸水冲泡咖啡"); } void addCondiments() { System.out.println("加糖和牛奶"); }}class Tea extends Beverage { void brew() { System.out.println("用沸水泡茶叶"); } void addCondiments() { System.out.println("加柠檬"); } // 覆盖钩子,控制是否添加调料 boolean customerWantsCondiments() { return false; // 茶不加调料 }}
使用模板方法
客户端只需调用模板方法,无需关心内部流程细节。不同的子类对象会表现出不同的行为,但整体结构一致。
public class Main { public static void main(String[] args) { Beverage coffee = new Coffee(); Beverage tea = new Tea(); System.out.println("准备咖啡:"); coffee.prepare(); System.out.println("n准备茶:"); tea.prepare(); }}
输出结果:
准备咖啡:
烧开水
用沸水冲泡咖啡
倒入杯中
加糖和牛奶
准备茶:
烧开水
用沸水泡茶叶
倒入杯中
基本上就这些。模板方法让公共逻辑集中在父类,变化的部分交给子类处理,既避免了代码重复,又提升了扩展性。关键是把流程控制放在抽象类里,只开放必要的定制点。
以上就是在Java中如何使用抽象类实现模板方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/942791.html
微信扫一扫
支付宝扫一扫