1. 程式人生 > >設計模式之-模板方法模式

設計模式之-模板方法模式

角色

  • 抽象類(AbstractClass):實現了模板方法,定義了演算法的骨架。
  • 具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的演算法

舉個例子,以準備去學校所要做的工作(prepareGotoSchool)為例,假設需要分三步:穿衣服(dressUp),吃早飯(eatBreakfast),帶上東西(takeThings)。學生和老師要做得具體事情肯定有所區別。
抽象類AbstractClass

public abstract class AbstractPerson{  
     //抽象類定義整個流程骨架  
     public void prepareGotoSchool
(){ dressUp(); eatBreakfast(); takeThings(); } //以下是不同子類根據自身特性完成的具體步驟 protected abstract void dressUp(); protected abstract void eatBreakfast(); protected abstract void takeThings(); }

具體類ConcreteClass

public class Student extends
AbstractPerson{
@Override protected void dressUp() { System.out.println(“穿校服"); } @Override protected void eatBreakfast() { System.out.println(“吃媽媽做好的早飯"); } @Override protected void takeThings() { System.out.println(“背書包,帶上家庭作業和紅領巾"); } }
public class Teacher extends AbstractPerson{  
     @Override  
     protected void dressUp() {  
          System.out.println(“穿工作服");  
     }  
     @Override  
     protected void eatBreakfast() {  
          System.out.println(“做早飯,照顧孩子吃早飯");  
     }  

     @Override  
     protected void takeThings() {  
          System.out.println(“帶上昨晚準備的考卷");  
     }  
}  
public class Client {  
     public static void main(String[] args) {  
     Student student = new Student()  
     student.prepareGotoSchool();  

     Teacher teacher  = new Teacher()  
     teacher.prepareGotoSchool();  
     }  
}  

優點
模板方法模式通過把不變的行為搬移到超類,去除了子類中的重複程式碼。
子類實現演算法的某些細節,有助於演算法的擴充套件。
通過一個父類呼叫子類實現的操作,通過子類擴充套件增加新的行為,符合“開放-封閉原則”。

缺點
每個不同的實現都需要定義一個子類,這會導致類的個數的增加,設計更加抽象。

適用場景
在某些類的演算法中,用了相同的方法,造成程式碼的重複。
控制子類擴充套件,子類必須遵守演算法規則。