模板方法模式
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。 模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。通俗的說的就是有很多相同的步驟的,在某一些地方可能有一些差別適合於這種模式,如大話設計模式中說到的考試場景中,每個人的試卷都是一樣的,只有答案不一樣。這種場景就適合於模板方法模式。
模板方法模式適用的業務場景
- 算法或者操作遵循相似的邏輯
- 重構時(把相同的代碼抽取到父類中)
- 重要、複雜的算法,核心算法設計爲模板方法
代碼實現
現在我有一個需求,就是要建立一套上課業務規則
- 上課
- 考情
- 下課
/**
* 班級規則
*/
public abstract class ClassShangke {
public void shangke(){
}
public abstract void kaoqing();
public void xiake(){
}
//注意模版規則 final 不可被重寫
public final void guize(){
shangke();
kaoqing();
xiake();
}
}
/**
* A班級上課
*/
public class AClassKaoQing extends ClassShangke {
@Override
public void kaoqing() {
System.out.println("AClassKaoQing kaoqing");
}
}
/**
* B班級上課
*/
public class BClassKaoQing extends ClassShangke {
@Override
public void kaoqing() {
System.out.println("BClassKaoQing kaoqing");
}
}
//運行
ClassShangke classShangkea = new AClassKaoQing();
classShangkea.guize();
ClassShangke classShangkeb = new BClassKaoQing();
classShangkeb.guize();
我在項目中對網絡請求返回數據進行模版方法定義
public abstract class BaseRxNetworkResponseObserver<T extends SModel> extends BaseRxNetworkObserver<T> {
@Override
public final void onNext(T t) {
onBeforeResponseOperation();
try{
onResponse(t);
}catch (Exception e){
ULog.e(e,e.getMessage());
ULog.e(e);
TipToast.shortTip(e.getMessage());
onResponseFail(new CustomarilyException(e.getMessage()));
}finally {
onNextFinally();
}
}
protected void onNextFinally() {
}
/**
* 返回值
* @param t
*/
public abstract void onResponse(T t);
/**
* 錯誤
* @param e
*/
public abstract void onResponseFail(Exception e);
/**
* 執行一些起始操作
*/
protected abstract void onBeforeResponseOperation();
}
注意模版方法的final 爲了制定一些規則必須不可以被重寫
模板方法模式的優點
- 封裝性好
- 複用性好
- 屏蔽細節
- 便於維護