淺談模板方法模式

程式界小強發表於2015-05-25

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u010741376/article/details/45967973

 模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。模板方法名字的由來:模板方法模式需要開發抽象類和具體子類的設計師之間的協作。一個設計師負責給出一個演算法的輪廓和骨架,另一些設計師則負責給出這個演算法的各個邏輯步驟。代表這些具體邏輯步驟的方法稱做基本方法(primitive
method);而將這些基本方法彙總起來的方法叫做模板方法(template method),這個設計模式的名字就是從此而來。

   

模板方法模式中的方法

  模板方法中的方法可以分為兩大類:模板方法和基本方法。

  模板方法

  一個模板方法是定義在抽象類中的,把基本操作方法組合在一起形成一個總演算法或一個總行為的方法。

  一個抽象類可以有任意多個模板方法,而不限於一個。每一個模板方法都可以呼叫任意多個具體方法。

  基本方法

  基本方法又可以分為三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)。

  ●  抽象方法:一個抽象方法由抽象類宣告,由具體子類實現。在Java語言裡抽象方法以abstract關鍵字標示。

  ●  具體方法:一個具體方法由抽象類宣告並實現,而子類並不實現或置換。

  ●  鉤子方法:一個鉤子方法由抽象類宣告並實現,而子類會加以擴充套件。通常抽象類給出的實現是一個空實現,作為方法的預設實現。

  例項:

     抽象模板角色類:

  

/**
 * 模板方法模式 
 * @author Administrator
 *
 */
public abstract class Account {
       
	/**
	 * 計算利息數額
	 * @return  返回利息數額
	 */
	   public final double calculateInterest(){
    	   double interestRate =doCalculateInterestRate();
    	   String accountType =doCalculateAccountType();
    	   double amount=calculateAmount(accountType);
		   return amount*interestRate;
       }
	   //基本方法需要子類實現
	   protected abstract String doCalculateAccountType();
	   
	   //基本方法需要子類實現
	   protected abstract double doCalculateInterestRate();
	   
	   //基本方已實現
	   private double calculateAmount(String accountType){
		   return 7243.00;
	   }
}

具體模板角色類:

  

/**
 * 具體模板實現類
 * @author Administrator
 *
 */
public class MoneyMarketAccount extends Account {

	@Override
	protected String doCalculateAccountType() {
	
		return "Money Market";
	}

	@Override
	protected double doCalculateInterestRate() {
		
		return 0.045;
	}

}

public class CDAccount extends Account {

	@Override
	protected String doCalculateAccountType() {
		
		return "Certificate of Deposite";
	}

	@Override
	protected double doCalculateInterestRate() {
		
		return 0.06;
	}

}

客戶端類:

 

public class Client {
	public static void main(String[] args) {
		 Account account=new MoneyMarketAccount();
	      System.out.println("貨幣市場賬號的利息數額為:" + account.calculateInterest());
	      account = new CDAccount();
	      System.out.println("定期賬號的利息數額為:" + account.calculateInterest());
	}
     
}



相關文章