模板方法模式 (父類的方法調用了子類重寫的方法..)
<設計模式其實很簡單>筆記
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod使得子類可以不改變一個算法的結構即可重新定義該算法的某些特定步驟。
//抽象模板類
public abstract class AbstractClass{
public abstract void PrimitiveOperationA();
public abstract void PrimitiveOperationB();
public abstract void PrimitiveOperationC();
//抽象的模板方法
public void TemplateMethod(){
PrimitiveOperationA();
PrimitiveOperationB();
PrimitiveOperationC();
}
}
//子類A
public class ConcreteClassA extends AbstractClass{
//覆蓋父類的抽象方法
@Override
public void PrimitiveOperationA(){
System.out.println("the operation of method A for ClassA");
}
@Override
public void PrimitiveOperationB(){
System.out.println("the operation of method B for ClassA");
}
@Override
public void PrimitiveOperationC(){
System.out.println("the operation of method C for ClassA");
}
}
//子類B
public class ConcreteClassB extends AbstractClass{
//覆蓋父類的抽象方法
@Override
public void PrimitiveOperationA(){
System.out.println("the operation of method A for ClassB");
}
@Override
public void PrimitiveOperationB(){
System.out.println("the operation of method B for ClassB");
}
@Override
public void PrimitiveOperationC(){
System.out.println("the operation of method C for ClassB");
}
}
//客戶端
public static void main(String[] args){
AbstractClass A;
A = new ConcreteClassA();
A.TemplateMethod();
A = new ConcreteClassB();
A.TemplateMethod();
}
③適用的地方:
一次性地實現一個算法不變的部分,而將可變的行爲留給子類來實現。
當子類中有公共的行爲可以提取到公共的父類中去,並且子類有自己的個性化要求時。
適用於模板方法模式的情形,一般子類需要擴展的地方是固定的,即允許在這些點上進行擴展。(這也是模板方法模式的侷限性)