定义:
在面向对象开发过程中,通常会遇到一些问题,比如我们知道一个算法所需要的关键步骤,并确定了这些步骤的执行顺序,但是,其中的某些步骤的具体实现是不可知的,或者说某些步骤是会随着环境的变化而变化,我们以一个小品中的故事为例,例如,把大象装冰箱,分三步:
第一步:把冰箱门打开
第二步:把大象放进去
第三步:把冰箱门关上
对于以上例子,分三步,顺序是固定的,但是如果让放进去的不是大象,而是老虎,狮子,山羊。。。。等等,怎么办?所以说顺序是固定的,但是中间某些步骤是会随着环境的变化而变化或者说子类可以重写其中的某些步骤的具体实现来达到不同的行为。
使用场景:
1 多个子类有公有的方法,并且逻辑基本相同时
2 重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
3 重构时,模板模式是一个经常使用的模式,把相同的代码抽到到父类中,然后通过子类重写以达到不同的功能
还是以上面的把“某个东西”装进冰箱,来举例
代码示例如下:
1 /** 2 * 把大象放冰箱 3 */ 4 public abstract class EnterIceBox { 5 6 protected void openDoor(){ 7 System.out.println(" 1 打开冰箱门"); 8 } 9 10 protected void enterInfoIcobox(){ 11 System.out.println(" 2 把大象放冰箱"); 12 } 13 14 protected void closeDoor(){ 15 System.out.println(" 3 关闭冰箱门"); 16 } 17 18 protected final void start(){ 19 openDoor(); 20 enterInfoIcobox(); 21 closeDoor(); 22 } 23 }
上面是把大象放冰箱,如果我想把一只大公鸡放进冰箱呢?代码如下
1 //把公鸡放进冰箱 2 public class ChickenEnterIceBox extends EnterIceBox{ 3 @Override 4 protected void enterInfoIcobox() { 5 System.out.println("2 把小鸡放冰箱"); 6 } 7 }
1 /** 2 * 模板模式测试类 3 */ 4 public class TemplateTest { 5 public static void main(String[] args){ 6 test(); 7 } 8 9 public static void test(){ 10 EnterIceBox chickenEnterIceBox = new ChickenEnterIceBox(); 11 chickenEnterIceBox.start(); 12 13 } 14 15 }
模板模式在框架中用的比较多,比如android源码中的View的绘制,首先 measure,layout,draw
子类通过重写不同的方法,就可以自定义出不同的控件。以上的例子很简单,也是为了很好的说明问题
希望对大家有所帮助。
注:设计模式交流学习群 632945466 欢迎所有热爱技术的大牛,小菜,一起学习讨论进步提高,欢迎随时批评指正
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通