版权声明:如需转载请标明出处 https://blog.csdn.net/yj201711/article/details/84146818
由抽象类衍生出的一种设计模式:模板设计模式(模板方法设计模式)
模板设计模式,就是将完成某件事固定不变的步骤设计成模板,要用 abstract 修饰的方法,然后将不确定的业务逻辑设计成抽象的方法,目的就是让子类继承并且复写该抽象方法,能够为了实现可扩展性。官方的说法是:定义一个操作中的算法框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。
模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。
【案例】
同一个用户在不同银行分别储蓄了一定金额的存款,2年之后他想知道在每个银行分别能拿到多少本息?(本息 = 本金 + 利息)(利息 = 本金 *利率*存期*100%)
设计思想
通过分析得出,不管他想知道哪个银行的本息,都是用过本金 + 利息的方法得到的,但是问题来了,每个银行计算利息的方式是不同的,当然不是说方式不同,而是每个银行根据客户的存期参与计算的利率是不相同的。那么可以根据模板方法模式,可以讲计算本息的过程设计成用 final 修饰的方法,而计算利息的过程可以设计成抽象的方法,然后可以由每个银行类通过继承模板类并复写计算利息的方法来计算出每个银行的利息,最后得出本息。
/**
* 模板类:每个银行获取本息的方式是固定不变的,但是利息是通过每个银行自己的规定的利率计算得到的。
* 利息=本金*存期*利率
* 本息=本金+利息
*/
abstract class Interest{
/**
* 获取本息
* @param capital:本金
* @return
*/
public final Double getCapital(Double capital,int time){
return capital+getInterest(capital,time);
}
//获取利息
//public abstract Double getInterest();
public abstract Double getInterest(double capital,int time);
}
/**
* 建设银行
*/
class JSBank extends Interest{
//获取指定用户的本金、存期等数据
// public double capital = 38654.6;
// public int time = 24;
//计算客户利息
@Override
public Double getInterest(double capital, int time) {
int num = time/12; //根据用户存期得到年利率
switch(num){
case 1:
return capital*0.0175*num; //一年
case 2:
return capital*0.0225*num; //二年
case 3:
return capital*0.0275*num; //三年
case 5:
return capital*0.0275*num; //五年
}
return capital*0.0135; //未满一年
}
}
/**
* 浦发银行
*/
class PFBank extends Interest{
//获取指定用户的本金、存期等数据
//public double capital = 38654.6;
//public int time = 24;
@Override
public Double getInterest(double capital, int time) {
int num = time/12; //根据用户存期得到年利率
switch(num){
case 1:
return capital*0.02*num; //一年
case 2:
return capital*0.024*num; //二年
case 3:
return capital*0.028*num; //三年
case 5:
return capital*0.028*num; //五年
}
return capital*0.0135; //未满一年
}
}
public class Test {
public static void main(String[] args) {
Interest inte1 = new JSBank();
double money1 = inte1.getCapital(38654.6,24);
System.out.println(money1);
Interest inte2 = new PFBank();
double money2 = inte2.getCapital(38654.6,24);
System.out.println(money2);
}
}