java 设计模式之TemplateMethod(模板方法模式)

模板方法
模板方法思想:模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
用大白话来说:就是把重复的抽取出来,不一致的单独实现!
假设我们不使用模板方法设计模式
场景:
(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中也是用了模板方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值