1. 程式人生 > >JAVA基礎(57)---模板設計模式

JAVA基礎(57)---模板設計模式

由抽象類衍生出的一種設計模式:模板設計模式(模板方法設計模式)

模板設計模式,就是將完成某件事固定不變的步驟設計成模板,要用 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);
	}
}