一、引
我們在日常的代碼設計中,會遇到許多固定的邏輯操作,那麼這個時候如果不進行一定的設計,就會出現冗餘的邏輯重複,導致代碼維護性不高,所以一般遇到這種情況,我們應該設法將這些固定的操作與可變的操作進行分離,每次修改只要變動可變操作即可。這就是這次要講的模板方法模式。
二、問題
既然是模板方法,那我們引出的問題也是模板,如何設計一個問卷的情景操作。
三、理解
我們先來分析一下問題,問卷情景中,我們可以分析出必須有一個問卷和一些填寫問卷的人,其中,問卷只有一個,填寫問卷的人卻很多,而且每個人都有自己的答案。那麼我們可以將這個問題濃縮成,在問卷中天答案,即問卷類+答案類。分析到這,我們其實已經可以看出,問卷就是模板方法模式中的模板類,我們只要設計出一個問卷類和一個答案類,每次將一個答案類傳給問卷類,就意味着一個人填寫了問卷,這樣方便簡潔。在模板方法設計模式中,我們利用上面填問卷的這種思想,設計出父類,將所有重複的代碼提升到父類中,而不是讓每個子類都去重複,當我們要完成在某一細節層次一致的一個過程或一系列步驟,但其個別細節步驟在更詳細的層次上的實現可能不同,我們通常考慮用模板方法模式實現。模板方法的結構圖如下:
模板方法模式的專業表達是,定義一個操作中的算法骨架,而將一些步驟延遲到子類中,模板方法模式可以是一個子類可以不改變算法結構即可重定義算法中的某些步驟。
四、實現
abstract class AbstractClass {
public abstract void PrimitiveOperation1();//這些再子類中具體實現
public abstract void PrimitiveOperation2();
public void TemplateMethod() {
PrimitiveOperation1();
PrimitiveOperation2();
//其他固定操作
}
}
public class ConcreteClass extends AbstractClass {
@Override
public void PrimitiveOperation1() {
// 子類的具體實現
}
@Override
public void PrimitiveOperation2() {
// 子類的具體實現
}
}
public class ConcreteClassB extends AbstractClass {
@Override
public void PrimitiveOperation1() {
// 子類的具體實現
}
@Override
public void PrimitiveOperation2() {
// 子類的具體實現
}
}
public class Main {
public static void main(String[] args) {
AbstractClass abstractClass;
abstractClass = new ConcreteClass();
abstractClass.TemplateMethod();
abstractClass = new ConcreteClassB();
abstractClass.TemplateMethod();
}
}