抽象类结合模板模式的核心是用抽象类定义算法骨架,将可变部分推迟到子类实现,确保结构统一且支持灵活扩展;模板方法须定义在抽象类中并常以final修饰,骨架包含已实现步骤、抽象方法和钩子方法,子类仅覆写抽象方法与可选钩子,严格遵循开闭原则。

抽象类结合模板模式,核心是用抽象类定义算法骨架,把可变部分推迟到子类实现,既保证结构统一,又支持灵活扩展。
抽象类必须承载算法骨架
模板方法必须定义在抽象类中,通常用 final 修饰,防止子类意外重写流程顺序。骨架里包含三类方法:
- 已实现的通用步骤(如取号、评价)——直接复用
- 抽象方法(如办理业务)——强制子类提供具体逻辑
- 钩子方法(默认空实现)——子类可选择性覆盖,用于条件分支或扩展点
子类只负责实现差异逻辑
非抽象子类必须覆写所有抽象方法,但不能修改模板流程本身。这确保了“算法结构稳定,行为细节可变”:
- 比如银行系统中,
takeNumber()和evaluate()固定执行,只有transact()由子类决定是存钱还是取钱 - 若子类不想改某一步骤,就不用重写对应钩子方法;想干预,就覆写它
严格遵循开闭原则
新增业务类型(如转账、缴费)只需添加新子类,无需改动抽象类和已有子类:
立即学习“Java免费学习笔记(深入)”;
- 对扩展开放:加一个
TransferUser extends BankTemplate并实现transact() - 对修改关闭:原有
Useer1Useer2和模板方法process()完全不动
抽象类本身要合理设计构造与访问控制
它不是用来实例化的,而是为继承服务的:
- 可以有构造方法——用于初始化共享状态(如客户ID、柜台编号)
- 抽象方法不能用 private、final 或 static 修饰,否则无法被子类继承和重写
- 普通方法和字段可自由定义,用于支撑模板逻辑或子类共用功能


















