一、简介
1、定义
定义一个操作中的算法逻辑,而将一些步骤延迟到子类中。(子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤)
2、使用场景
当我们要完成某一细节层次一致的一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,就考虑使用模板方法来处理
3、应用实例
1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。
2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。
3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
4、优缺点
优点:1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
二、具体实现
1、UML类图
2、示例场景
在“修改”或“删除”日志的时候,都需要进行以下步骤:
用户身份验证;
具体日志操作;
发送通知;
那么这个时候就可以使用“模板方法模式”,具体如下:
3、实例的UML类图
4、LogTemplate
package com.mfc.design.模板方法模式;
/**
* @author MouFangCai
* @date 2019/10/14 10:22
*/
public abstract class LogTemplate {
public void logOperation(String userName){
// 固定方法:子类不能重写
authentication(userName);
// 抽象方法:子类必须自定义实现
operation();
// 钩子方法:子类可以重写自定义
sendMessage(userName);
}
// 固定方法:1、用户身份验证(该方法被final修饰,禁止被子类恶意篡改)
private final void authentication(String userName){
System.out.println(userName + ":身份验证通过");
}
// 抽象方法:2、自定义日志操作
public abstract void operation();
// 钩子方法:3、发送通知
public void sendMessage(String userName){
System.out.println(userName + ":操作了日志");
}
}
5、DeleteLog
package com.mfc.design.模板方法模式;
/**
* @author MouFangCai
* @date 2019/10/14 10:39
*/
public class DeleteLog extends LogTemplate {
@Override
public void operation() {
System.out.println("删除日志");
}
@Override
public void sendMessage(String userName) {
System.out.println("DeleteLog中,钩子方法被重写\n" + userName + ":删除了日志");
}
}
6、UpdateLog
package com.mfc.design.模板方法模式;
/**
* @author MouFangCai
* @date 2019/10/14 10:42
*/
public class UpdateLog extends LogTemplate {
@Override
public void operation() {
System.out.println("修改日志");
}
}
7、Client_Template客户端
package com.mfc.design.模板方法模式;
/**
* @author MouFangCai
* @date 2019/10/14 10:43
*/
public class Client_Template {
public static void main(String[] args) {
LogTemplate deleteLog = new DeleteLog();
deleteLog.logOperation("mfc1");
System.out.println("--------------------");
LogTemplate updateLog = new UpdateLog();
updateLog.logOperation("mfc2");
}
}
8、实例运行结果
mfc1:身份验证通过
删除日志
DeleteLog中,钩子方法被重写
mfc1:删除了日志
mfc2:身份验证通过
修改日志
mfc2:操作了日志Process finished with exit code