本文最后更新于 2025年7月26日 晚上
定义一个操作中的算法框架,而将一些步骤延迟到子类中,使子类可以不改变一个算法的结构,即可重新定义该算法的某些步骤。
角色
- 算法定义类 : 定义算法架构的类,可以在某个操作方法中定义完整的流程,定义流程中会调用方法,这些方法将由子类重新实现
- 实现类 : 重新实现父类中定义的方法,并可按照子类的执行情况,反应步骤实际的内容
优点
封装不变部分,扩展可变部分。
提高代码复用,减少重复代码。
避免子类重复实现整体流程逻辑。
缺点
增加类的数量,每个变化点都可能导致创建多个子类。
父类对子类的约束较强,违反开闭原则时可能影响多个子类。
适用场景
多个类有相同方法结构,但某些步骤实现不同。
程序中有固定流程,允许局部变化。
实现模板方法模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| public abstract class WayToHome { public final void goHome() { prepare(); tool(); arrive(); }
public void prepare() { System.out.println("准备回家"); }
public abstract void tool();
public void arrive() { System.out.println("已经到家"); } }
public class WayToHomeByCar extends WayToHome { @Override public void tool() { System.out.println("开车回家"); } }
public class WayToHomeByBike extends WayToHome { @Override public void tool() { System.out.println("骑自行车回家"); } }
public class Test{ public static void main(String[] args) { WayToHome homeByCar = new WayToHomeByCar(); homeByCar.goHome();
WayToHome homeByBike = new WayToHomeByBike(); homeByBike.goHome(); } }
|
总结
模板方法模式通过 在父类中定义一个算法的框架 ,并将具体步骤延迟到子类中,使得子类在不改变算法整体结构的前提下,灵活地重定义某些步骤。