java設計模式---模板方法

1.概念java

(1)模板方法是基於繼承的代碼複用技術,在模板方法模式中,能夠將相同的代碼放在父類之中,而講不一樣的方法實現放在不一樣 的子類之中。編程

(2)在模板方法之中,咱們須要一個抽象類,將部分邏輯以具體方法以及具體構造函數的方式實現。而後聲明一些抽象方法讓子類實現剩餘的邏輯。框架

(3)模板方法是一種類行爲模式。ide

2.結構函數

模板方法模式包含的角色工具

AbstractClass :抽象類this

ConcreteClass:具體子類.net

模板基本方法的組成部分:繼承

抽象方法(AbstrsctCalss Method)接口

具體方法(Concrete Method)

鉤子方法(Hook Method)

3.應用

普遍應用於框架技術(Spring、struts,TestCase..........).

4.模式擴展

好萊塢原則"( Don't call us,we'll call you)點擊連接加入羣聊【java技術交流】:https://jq.qq.com/?_wv=1027&k=5znQn4K

(1)機制

子類不顯式的調用父類的方法,而是經過覆蓋父類的放法來實現某些具體的業務邏輯,【父類控制對子類的調用】

(2)體現

子類不要調用父類,而經過父類來調用子類,將某些實現的方法寫在子類中,讓父類來控制整個過程。

(3).鉤子(Hook Method)方法的使用

1.使子類能夠控制父類的行爲

2.最簡單的鉤子方法就是空方法,也能夠再鉤子方法中定義一個默認的實現。若是子類不覆蓋鉤子方法,就執行父類默認實現的代碼

3.複雜的鉤子方法能夠對其餘的方法約束,這種鉤子一般返回一個boolean類型(true或false),用來判斷是否執行一個基本方法

4.示例:

public  void temp{

open();

display();

if(isPrint())

{

print();

}}

//判斷函數-----鉤子方法

public boolean isPrint(){

return true;

}

5.模板方法的具體示例:

每家銀行,有不一樣的存儲類型(活期、按期等),因每家銀行存儲方式的利率不一樣,因此有不一樣的收益,請編程計算不一樣銀行的年收益。收益=本金+(本金*利率)

Account接口類:

package com.accp.ven;
/**
 * 計算收益的接口
 * @author wen
 *
 */
public interface Account {
 /**獲取收益*/
 public  double getinComing();
 
 /**獲取利率*/
 public double getRate();

}

實現Account的類

package com.accp.ven;
/**
 * 收益接口的實現類
 * @author wen
 *
 */
public abstract class BaseAccount implements Account {
  private double balance;//餘額
    public double getBalance() {
  return balance;
 }

 public void setBalance(double balance) {
  this.balance = balance;
 }


 @Override
 public double getinComing() {
  return balance+(balance*getRate());
 }

 @Override
 /**
  * 不一樣的存儲l類型有不一樣的利率,所以把次方法改寫成abstract方法,供子類去實現(模板方法)
  */
 public abstract double getRate();
}

package com.accp.ven;

import java.util.HashMap;
import java.util.Map;

/***
 * 利率表
 * @author wen
 *
 */
public class RateTable {
 
 private static Map<String, Double> map = new HashMap<String, Double>();
 
 
 static{
  
  map.put("a1", 0.1212);
  map.put("a2", 0.012);
  map.put("b1", 0.333);
  
 }
     
 /**
  * 經過key-value獲取value
  */
 public static double getRateByType(String type) {
  return map.get(type);
 }
}

package com.accp.ven;

 //工具類

public class AccountUtil {

 private AccountUtil() {
 }
 
 public static double calc(Account act) {
  return act.getinComing();
 }
}

package com.accp.ven;

//農業銀行

public class ABCAccount extends BaseAccount {

 @Override
 public double getRate() {
 
  return RateTable.getRateByType("a2");
 }

}

package com.accp.ven;

//郵政銀行

public class YZAccount extends BaseAccount {

 @Override
 public double getRate() {
  
  return RateTable.getRateByType("b1");
 }

}

相關文章
相關標籤/搜索