當乙個演算法分成很多步驟時,其中有些步驟是固定不變的,有些步驟是會變化的。那麼一般的想法是直接把每一步都作為乙個方法寫出來,然後在主方法中呼叫:
class steps
void func1()
void func2()
void func3()
void func4()
}class structure
}
這種做法的不足是當其中乙個步驟變了,那麼就要再新建乙個steps1類,steps1中所有的方法都要重新編譯過。而且主函式中也要重新生成該類的物件。這樣沒有實現**的復用,這裡的復用不單指不用重寫**,而是指執行時的復用,不用編譯新的類,直接復用舊的類。但就算乙個類中有一行**的改變,這個類就要被重新編譯,不算復用了。而設計模式的目的在於提高**的執行編譯復用。
為了改進這種方法,就有第二種做法,將經常變化的幾個步驟放到另乙個類中:
class staticsteps
void func1()
void func2()
}class dynamicsteps
void func4()
}class structure
}
這種做法變化的部分提取了出來,但是根據開閉原則,當哪個步驟有變化時,是要生成新的dynamicsteps1類,而不是在已有的dynamicsteps類上改動,那麼當有哪個步驟需要更改時,主函式就需要生成新的類的物件,那麼主函式就要變了,但是我們知道乙個演算法的主要流程架構是屬於穩定部分,不能輕易改動。於是再改進,它的目的是不改動主函式:
abstract class staticsteps
void func1()
void func2()
abstract void func3();
abstract void func4();
}//將變化的部分延遲到子類實現
class dynamicsteps extends staticsteps
@override
void func4()
}class structure
}
這樣當其中幾步改變時,以上**是不會變的,我們需要改變的是新增乙個類實現更改的步驟,在呼叫run函式時實參傳遞的是新增的類。這就是template method模式,模板方法模式在乙個方法中定義乙個演算法的骨架,而將一些步驟的實現延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中某些步驟的具體實現。 Template Method 模板模式
模式定義 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,從而使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。使用方法 各子類中公共的方法提煉出來,集中到父類中定義。而不同的子類所特有的方法,可以通過繼承父類的方法在內部自定義。使用範圍 多個子類存在共通的方法,個別的方法...
設計模式 template method
1 定義乙個操作中演算法的骨架,將一些步驟推遲到子類中實現。可以不改變演算法的結構而重定義該演算法的步驟 2 要完成在某乙個細節層次一致的乙個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同。3 允許定義可變的子步驟,同時保持基本過程不致 4 由乙個抽象類組成,這個抽象類定義了需要覆蓋的...
模板模式 Template Method
定義 模板方法模式準備乙個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。先制定乙個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。開閉原則是指乙個軟體實體應該對擴充套件開...