JUnit中的设计模式:模板方法模式 Template Method
JUnit中的设计模式:模板方法模式
模板方法模式 Template Method
定义一个操作中的算法骨架,而将一些步骤延伸到子类中去,使得子类可以不改变一个算法的结构,即可重新定义该算法的某些特定步骤。
这里需要复用的是算法的结构,也就是步骤,而步骤的实现可以在子类中完成。
使用场合
1.一次性实现一个算法的不变部分,并且将可变的行为留给子类来完成。
2.各子类公共的行为应该被提取出来并集中到一个公共父类中以避免代码的重复。
首先识别现有代码的不同之处,并且把不同部分分离为新的操作,最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3.控制子类的扩展。
模板方法模式的组成
父类角色:提供模板
子类角色:为模板提供实现。
代码例子
下面是一个简单的模板方法模式的代码例子:
首先,定义父类,规定了几个抽象的方法,和模板方法,其中包含了对抽象方法的调用,并且规定了顺序:
package com.meng.designpattern.templatemethod; public abstract class AbstractClass { public void template() { // 父类规定了做事情的顺序(定义了算法骨架) this.method1(); this.method2(); this.method3(); } // 具体做的实现由子类完成 public abstract void method1(); public abstract void method2(); public abstract void method3(); }
然后,子类继承父类,实现抽象方法:
package com.meng.designpattern.templatemethod; public class ConcreteClass extends AbstractClass { public ConcreteClass() { } @Override public void method1() { System.out.println("Step 1"); } @Override public void method2() { System.out.println("Step 2"); } @Override public void method3() { System.out.println("Step 3"); } }
调用时使用父类接口,但是建立子类对象:
package com.meng.designpattern.templatemethod; public class Client { public static void main(String[] args) { AbstractClass ac = new ConcreteClass(); ac.template(); } }
程序输出:
Step 1
Step 2
Step 3
可以看到虽然具体实现是由子类完成,但是方法调用的顺序是按照父类规定的来完成的。
JUnit中的模板方法模式体现
以JUnit3为例,JUnit3中,所有的测试类都要继承于TestCase,这个基类中规定了方法调用的顺序,所以每次测试时都是先执行setUp(),再执行测试方法,最后执行tearDown()。
可以查看JUnit3的源代码:
/** * Runs the bare test sequence. * * @exception Throwable * if any exception is thrown */ public void runBare() throws Throwable { setUp(); try { runTest(); } finally { tearDown(); } }
参考资料
圣思园张龙老师视频教程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了