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");
}
}