設計模式-模板方法

模板方法模式

定義

定義操做中的算法框架,而將具體的操做定義延遲到子類中實現,使得子類在不改變算法結構的狀況下依然能夠從新定義
算法的某些特定步驟
理解:就像是書的目錄,老師已經制定好書的章節,分配給學生按照目錄完成書籍,學生按照本身的知識填寫目錄內容
uml

模板方法應用普遍,也比較簡單,僅僅使用了Java的繼承機制

AbstractParentClass 稱爲抽象模板,抽象模板中的方法分爲兩類:
· 基本方法:由子類實現的方法,
· 模板方法:通常是一個具體的方法,也就是一個算法框架(調用邏輯),實現對基本方法調度,完成固定邏輯

AClass 和 BClass 稱爲具體模板:主要是實現抽象模板中的基本方法

注意:爲了防止惡意操做,模板方法通常都加final關鍵字
基本方法儘可能設計成protected類型(符合迪米特法則:不須要暴露的屬性和方法儘可能設置爲protected類型),若非必要不要擴大
方法的訪問權限
優勢

· 封裝不變部分,擴展可變部分算法

把認爲不可變的部分封裝到父類實現,可變部分則能夠經過繼承來繼續擴展

· 提取公共部分代碼,便於維護框架

· 行爲由父類控制,子類實現ide

缺點
按照設計習慣通常是定義抽象後實現,但模板方法模式定義了部分實現,子類的實現改變告終果,帶來了閱讀上難度
使用場景
1. 多個子類有相同的方法,且邏輯基本相同
2. 重要複雜的算法,可把核心算法封裝爲模板方法
3. 重構時
實現
  • 抽象模板
public abstract class AbstractCommand {

	/**
	 * HOOK METHOD
	 * @return
	 */
	protected abstract  boolean pre() ;

	protected abstract  void after() ;

	protected abstract void run();

	public final void executeRun(){
		if(pre()){
			run();
			after();
		}
	}
	
}
  • 模板實現
public class ACommand extends AbstractCommand {

	@Override
	protected boolean pre() {
		return true;
	}

	@Override
	protected void after() {
		System.out.println("執行了A after()");

	}

	@Override
	protected void run() {
		System.out.println("執行了A run()");
	}
}
public class BCommand extends AbstractCommand {

	@Override
	protected boolean pre() {
		return false;
	}

	@Override
	protected void after() {
		System.out.println("執行了B after()");
	}

	@Override
	protected void run() {
		System.out.println("執行了B run()");
	}
}
  • client 調用
public class Test {

	public static void main(String[] args) {
		ACommand a = new ACommand();

		BCommand b = new BCommand();

		a.executeRun();

		b.executeRun();

	}
}
擴展
增長鉤子方法(Hook Method)
當須要增長外部條件時,增長鉤子方法便可改變執行結果
相關文章
相關標籤/搜索