設(shè)計(jì)模式之模板方法模式 -- 抽取通用代碼邏輯到父類(lèi)
場(chǎng)景介紹:
(1)電商系統(tǒng)中購(gòu)物車(chē)進(jìn)行結(jié)算時(shí)谴忧,會(huì)有多種優(yōu)惠策略;
(2)不同的優(yōu)惠策略在計(jì)算的價(jià)格的時(shí)候,有一些通用的基礎(chǔ)邏輯沾谓;
(3)每種優(yōu)惠策略還有一些是自己特殊的價(jià)格計(jì)算的邏輯委造。
1.不使用設(shè)計(jì)模式
package com.lucky.pattern.template;
/**
* @author: LIJY
* @Description: 不使用設(shè)計(jì)模式
* @Date: 2021/10/2 20:36
*/
public class WithoutTemplateMethodPatternDemo {
public static void main(String[] args) {
DiscountCalculator1 calculator1 = new DiscountCalculator1();
calculator1.calculate();
DiscountCalculator2 calculator2 = new DiscountCalculator2();
calculator2.calculate();
DiscountCalculator3 calculator3 = new DiscountCalculator3();
calculator3.calculate();
}
public static class DiscountCalculator1 {
public void calculate() {
System.out.println("通用的計(jì)算邏輯");
System.out.println("優(yōu)惠計(jì)算器1的特殊計(jì)算邏輯");
}
}
public static class DiscountCalculator2 {
public void calculate() {
System.out.println("通用的計(jì)算邏輯");
System.out.println("優(yōu)惠計(jì)算器2的特殊計(jì)算邏輯");
}
}
public static class DiscountCalculator3 {
public void calculate() {
System.out.println("通用的計(jì)算邏輯");
System.out.println("優(yōu)惠計(jì)算器3的特殊計(jì)算邏輯");
}
}
}
缺點(diǎn)和問(wèn)題:
在三種優(yōu)惠方式計(jì)算器中,都有一段通用的計(jì)算邏輯均驶,是完全相同的代碼昏兆,如果該部分通用的代碼要修改,就涉及到多個(gè)地方的修改妇穴,一但某部分忘記修改就會(huì)出現(xiàn)問(wèn)題爬虱,可維護(hù)性、擴(kuò)展性較差腾它。
2.使用設(shè)計(jì)模式
package com.lucky.pattern.template;
/**
* @author: LIJY
* @Description: 使用設(shè)計(jì)模式
* @Date: 2021/10/2 20:45
*/
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
DiscountCalculator calculator1 = new DiscountCalculator1();
calculator1.calculate();
DiscountCalculator calculator2 = new DiscountCalculator2();
calculator2.calculate();
DiscountCalculator calculator3 = new DiscountCalculator3();
calculator3.calculate();
}
public interface DiscountCalculator {
void calculate();
}
/**
* 模板方法實(shí)現(xiàn)的精華所在
*/
public static abstract class AbstractDiscountCalculator implements DiscountCalculator {
public void calculate() {
// 完成通用的計(jì)算邏輯
commonCalculate();
// 完成特殊的計(jì)算邏輯
specificCalculate();
}
private void commonCalculate() {
System.out.println("通用的計(jì)算邏輯");
}
protected abstract void specificCalculate();
}
public static class DiscountCalculator1 extends AbstractDiscountCalculator {
@Override
public void specificCalculate() {
System.out.println("優(yōu)惠計(jì)算器1的特殊計(jì)算邏輯");
}
}
public static class DiscountCalculator2 extends AbstractDiscountCalculator {
@Override
public void specificCalculate() {
System.out.println("優(yōu)惠計(jì)算器2的特殊計(jì)算邏輯");
}
}
public static class DiscountCalculator3 extends AbstractDiscountCalculator {
@Override
public void specificCalculate() {
System.out.println("優(yōu)惠計(jì)算器3的特殊計(jì)算邏輯");
}
}
}