目录
一、模板方法模式介绍
1.1 模板方法模式的定义
1.2 模板方法模式的原理
1.2.1 模板方法模式类图
1.2.2 类图角色说明
1.2.3 示例代码
二、模板方法模式的应用
2.1 需求说明
2.2 需求实现
2.2.1 账户抽象类
2.2.2 借款一个月
2.2.3 借款7天
2.2.4 测试类
三、模板方法模式总结
3.1 模板方法模式的优点
3.2 模板方法模式的缺点
3.3 模板方法模式的使用场景
模板方法模式(template method pattern)原始定义是:在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。
模板方法中的算法可以理解为广义上的业务逻辑,并不是特指某一个实际的算法。定义中所说的算法的框架就是模板,包含算法框架的方法就是模板方法。
例如: 我们去医院看病一般要经过以下4个流程:挂号、取号、排队、医生问诊等,其中挂号、 取号 、排队对每个病人是一样的,可以在父类中实现,但是具体医生如何根据病情开药每个人都是不一样的,所以开药这个操作可以延迟到子类中实现。
模板方法模式是一种基于继承的代码复用技术,它是一种类行为模式。 模板方法模式其结构中只存在父类与子类之间的继承关系。
模板方法的作用主要是提高程序的复用性和扩展性:
模板方法模式的定位很清楚,就是为了解决算法框架这类特定的问题,同时明确表示需要使用继承的结构。
模板方法(Template Method)模式包含以下主要角色:
基本方法又可以分为三种:
package main.java.cn.test.template.V1;
/**
* @author ningzhaosheng
* @date 2024/1/15 11:36:33
* @description 抽象父类
*/
public abstract class AbstractClassTemplate {
void step1(String key) {
System.out.println("在模板类中 -> 执行步骤1");
if (step2(key)) {
step3();
} else {
step4();
}
step5();
}
boolean step2(String key) {
System.out.println("在模板类中 -> 执行步骤2");
if ("x".equals(key)) {
return true;
}
return false;
}
abstract void step3();
abstract void step4();
void step5() {
System.out.println("在模板类中 -> 执行步骤5");
}
void run(String key) {
step1(key);
}
}
package main.java.cn.test.template.V1;
/**
* @author ningzhaosheng
* @date 2024/1/15 11:37:48
* @description 实现类A
*/
public class ConcreteClassA extends AbstractClassTemplate{
@Override
void step3() {
System.out.println("在子类A中 -> 执行步骤 3");
}
@Override
void step4() {
System.out.println("在子类A中 -> 执行步骤 4");
}
}
package main.java.cn.test.template.V1;
/**
* @author ningzhaosheng
* @date 2024/1/15 11:38:35
* @description 实现类B
*/
public class ConcreteClassB extends AbstractClassTemplate {
@Override
void step3() {
System.out.println("在子类B中 -> 执行步骤 3");
}
@Override
void step4() {
System.out.println("在子类B中 -> 执行步骤 4");
}
}
package main.java.cn.test.template.V1;
/**
* @author ningzhaosheng
* @date 2024/1/15 11:39:16
* @description 测试类
*/
public class Test {
public static void main(String[] args) {
AbstractClassTemplate concreteClassA = new ConcreteClassA();
concreteClassA.run("");
System.out.println("===========");
AbstractClassTemplate concreteClassB = new ConcreteClassB();
concreteClassB.run("x");
}
}
P2P公司的借款系统中有一个利息计算模块,利息的计算流程是这样的:
package main.java.cn.test.template.V2;
/**
* @author ningzhaosheng
* @date 2024/1/15 11:43:55
* @description 账户抽象类
*/
public abstract class Account {
//step1 具体方法-验证用户信息是否正确
public boolean validate(String account, String password) {
System.out.println("账号: " + account + ",密码: " +
password);
if (account.equalsIgnoreCase("tom") && password.equalsIgnoreCase("123456")) {
return true;
} else {
return false;
}
}
//step2 抽象方法-计算利息
public abstract void calculate();
//step3 具体方法-显示利息
public void display() {
System.out.println("显示利息!");
}
//模板方法
public void handle(String account, String password) {
if (!validate(account, password)) {
System.out.println("账户或密码错误!!");
return;
}
calculate();
display();
}
}
package main.java.cn.test.template.V2;
/**
* @author ningzhaosheng
* @date 2024/1/15 11:44:54
* @description 借款一个月
*/
public class LoanOneMonth extends Account {
@Override
public void calculate() {
System.out.println("借款周期30天,利率为10%!");
}
}
package main.java.cn.test.template.V2;
/**
* @author ningzhaosheng
* @date 2024/1/15 11:45:27
* @description 借款七天
*/
public class LoanSevenDays extends Account {
@Override
public void calculate() {
System.out.println("借款周期7天,无利息!仅收取贷款金额1%的服务费!");
}
@Override
public void display() {
System.out.println("七日内借款无利息!");
}
}
package main.java.cn.test.template.V2;
/**
* @author ningzhaosheng
* @date 2024/1/15 11:46:43
* @description 测试类
*/
public class Test {
public static void main(String[] args) {
Account a1 = new LoanSevenDays();
a1.handle("tom","12345");
System.out.println("==========================");
Account a2 = new LoanOneMonth();
a2.handle("tom","123456");
}
}
好了,本次分享就到这里,欢迎大家继续阅读《设计模式》专栏其他设计模式内容,如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!