一、定義
模板方法模式定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
當我們要完成在某一細節層次一致的一個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同時,我們通常會考慮模板方法模式來處理。
模板方法模式很好的詮釋了代碼複用,通過把不變的行爲搬移到父類中取,去除子類中的重複代碼來體現它的優勢。
二、UML類圖
三、實現
- 模板方法抽象類
package com.jthao.design.des.templatemethod;
public abstract class AbstractClass {
protected abstract void doAnyThing();
protected abstract void doSomeThing();
protected void hookMethod() {
System.out.println("空方法");
}
private void concreteMethod() {
System.out.println("已實現的基本方法,由AbstractClass類實現");
}
public void templateMethod() {
hookMethod();
concreteMethod();
doAnyThing();
doSomeThing();
}
}
- 具體實現類A
package com.jthao.design.des.templatemethod;
public class ConcreteClass1 extends AbstractClass {
@Override
public void doAnyThing() {
System.out.println("ConcreteClass1 doAnyThing");
}
@Override
public void doSomeThing() {
System.out.println("ConcreteClass1 doAnyThing");
}
@Override
public void hookMethod() {
System.out.println("ConcreteClass1 重寫父類方法");
}
}
- 具體實現類B
package com.jthao.design.des.templatemethod;
public class ConcreteClass2 extends AbstractClass {
@Override
public void doAnyThing() {
System.out.println("ConcreteClass2 doAnyThing");
}
@Override
public void doSomeThing() {
System.out.println("ConcreteClass2 doAnyThing");
}
}
- 測試類
package com.jthao.design.des.templatemethod;
public class templateTest {
public static void main(String[] args) {
AbstractClass abstractClass1 = new ConcreteClass1();
abstractClass1.templateMethod();
AbstractClass abstractClass2 = new ConcreteClass2();
abstractClass2.templateMethod();
}
}