模板方法
模板方法思想:模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
用大白话来说:就是把重复的抽取出来,不一致的单独实现!
假设我们不使用模板方法设计模式
场景:
(1)我们做一个电商系统中商品有一个需求
(2)一个商品有多种优惠政策
(3)但是不同的优惠政策在计算价格时,都有一些通用的基础计算逻辑
(4)每种优惠政策还有自己独有的特殊计算逻辑
public class CalculationPolicy1{
public void calculate() {
System.out.println("通用的计算逻辑,修改了一下");
System.out.println("优惠计算器1的特殊计算逻辑");
}
}
public class CalculationPolicy2{
public void calculate() {
System.out.println("通用的计算逻辑,修改了一下");
System.out.println("优惠计算器2的特殊计算逻辑");
}
}
public class CalculationPolicy3{
public void calculate() {
System.out.println("通用的计算逻辑,修改了一下");
System.out.println("优惠计算器3的特殊计算逻辑");
}
}
public class Test1{
public static void main(String[] args) {
CalculationPolicy1 calculationPolicy1 = new CalculationPolicy1();
CalculationPolicy2 calculationPolicy2 = new CalculationPolicy2();
CalculationPolicy3 calculationPolicy3 = new CalculationPolicy3();
calculationPolicy1.calculate();
calculationPolicy2.calculate();
calculationPolicy3.calculate();
}
}
假如我们不使用设计模式,在上面的例子中就会有一个问题出现
(1)就是说在三个优惠方式的计算中,有一段通用的计算逻辑,是完全相同的代码。
(2)但是假设这段通用的计算逻辑,要要修改,但是你在修改过程中,有个方法忘了修改了,这造成的后果可想而知!
(3)而且到了后期,谁也记不得这段代码用在了多少个方法里。找起来!!
(4)这样的代码就是特别不好维护,不要扩展的!
下面我们用模板方法做一下,看看效果如何
(1)首先我们定义一个接口,这个接口有一个方法
(2)这个方法就是计算方法。
(3)然后再定义也给抽象类
(4)这个抽象类实现上面的接口
(5)在抽象类里这么定义,定义一个通用的计算逻辑的方法,并在抽象类中实现了,这样只要继承我这个抽象方法,就默认实现了我这个通用的计算逻辑。
(6)然后再定义一个抽象方法,这个方法不实现,由继承的子类来实现他的具体计算逻辑,这就是特殊的计算逻辑的方法
public interface CalculationPolicy{
void calculate();
}
public abstract class AbstractCalculationPolicy implements CalculationPolicy{
@Override
public void calculate() {
// 完成通用的计算逻辑
commonCalculate();
// 完成特殊的计算逻辑
specificCalculate();
}
private void commonCalculate(){
System.out.println("通用的计算逻辑");
}
public abstract void specificCalculate();
}
public static class CalculationPolicy1 extends AbstractCalculationPolicy {
@Override
public void specificCalculate() {
System.out.println("优惠计算器1的特殊计算逻辑");
}
}
public static class CalculationPolicy2 extends AbstractCalculationPolicy {
@Override
public void specificCalculate() {
System.out.println("优惠计算器2的特殊计算逻辑");
}
}
public static class CalculationPolicy3 extends AbstractCalculationPolicy {
@Override
public void specificCalculate() {
System.out.println("优惠计算器3的特殊计算逻辑");
}
}
这样使用起来是不是效果很好。
模板方法的使用场景:
(1)在项目开发中应该算是高频使用的设计模式之一了
(2)在一些框架的底层中也是高频使用的。比如AQS中就是用了模板方法。
(3)Servlet中也是用了模板方法