行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
行为型模式共有11种:
■ 模板方法模式
■ 命令模式
■ 责任链模式
■ 策略模式
■ 迭代器模式
■ 中介者模式
■ 观察者模式
■ 备忘录模式
■ 访问者模式
■ 状态模式
■ 解释器模式
一、模板方法模式的简介
■ 定义一个操作中的算法的框架,而将一些步骤延迟到子类中;
使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤;
![](https://img.haomeiwen.com/i10861568/3a90288ab43a2b75.png)
image.png
模板方法模式2个角色:
■ 抽象模板(Abstract Template)角色:
该角色定义一个或多个抽象操作,以便让子类实现;
■ 具体模板(Concrete Template)角色:
该角色实现抽象模板中定义的一个或多个抽象方法;
/**
* 抽象模板角色
*/
public abstract class AbstractClass {
/**
* 基本方法
*/
public abstract void operation();
/**
* 模板方法
*/
public void templateMethod(){
// 调用基本方法,完成相关逻辑
this.operation();
}
}
/**
* 具体模板角色
*/
public class ConCreteClass extends AbstractClass{
/**
* 实现基本业务方法
*/
@Override
public void operation() {
System.out.println("业务逻辑");
}
}
/**
* 应用代码
*/
public class ClientDemo {
public static void main(String[] args){
AbstractClass ac = new ConCreteClass();
// 调用模板方法
ac.templateMethod();
}
}
# 控制台输出:
业务逻辑
二、模板方法模式的优点
模板方法模式的优点:
■ 封装不变的部分,扩展可变部分;
不变的部分封装到父类中实现,而可变的部分则可以通过继承进行扩展;
■ 提取公共部分代码,便于维护;
将公共部分的代码抽取出来放在父类中,维护时只需要修改父类中的代码;
■ 行为由父类控制,子类实现;
子类可以通过扩展增加相应的功能,符合开闭原则;
三、模板方法模式的应用场景
■ 多个子类有公共方法,并且逻辑基本相同时;
■ 可以把重要的、复杂的、核心算法设计为模板方法,周边的相关细节功能则由各个子类实现;
■ 重构时,模板方法模式是一个经常使用的模式,将相同的代码抽取到父类中;
四、模板方法模式的实例
# 使用模板方法模式计算银行活期和定期账户的利息;
![](https://img.haomeiwen.com/i10861568/d87d95c31efc658b.png)
image.png
/**
* 抽象模板,抽象账户类
*/
public abstract class Account {
// 账号
private String accountNumber;
// 构造函数
public Account(){
accountNumber = null;
}
public Account(String accountNumber){
this.accountNumber = accountNumber;
}
/**
* 基本方法,确定账户类型,留给子类实现
* @return
*/
protected abstract String getAccountType();
/**
* 基本方法,确定利息,留给子类实现
* @return
*/
protected abstract double getInterestRate();
/**
* 基本方法,根据账号类型和账号确定账户金额
* @param accountType 账号类型
* @param accountNumber 账号
* @return
*/
public double calculateAmount(String accountType , String accountNumber){
// 访问数据库
System.out.println("访问数据库,确定账户金额为:" + 4567.00D);
return 4567.00D;
}
/**
* 模板方法,计算账户利息
* @return
*/
public double calculateInterest(){
String accountType = getAccountType();
double interestRate = getInterestRate();
double amount = calculateAmount(accountType, accountNumber);
return amount * interestRate;
}
}
/**
* 具体模板类,活期账户
*/
public class DemandAccount extends Account{
@Override
protected String getAccountType() {
return "活期";
}
@Override
protected double getInterestRate() {
return 0.005D;
}
}
/**
* 具体模板类,定期账户
*/
public class FixedAccount extends Account{
@Override
protected String getAccountType() {
return "一年定期";
}
@Override
protected double getInterestRate() {
return 0.0325;
}
}
/**
* 应用程序
*/
public class ClientAccount {
public static void main(String[] args){
Account account = new DemandAccount();
System.out.println("活期利息 : " + account.calculateInterest());
account = new FixedAccount();
System.out.println("定期利息 : " + account.calculateInterest());
}
}
# 控制台输出:
访问数据库,确定账户金额为:4567.0
活期利息 : 22.835
访问数据库,确定账户金额为:4567.0
定期利息 : 148.4275
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
网友评论