設計模式之-模板方法模式
阿新 • • 發佈:2019-01-07
角色
- 抽象類(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();
}
}
優點
模板方法模式通過把不變的行為搬移到超類,去除了子類中的重複程式碼。
子類實現演算法的某些細節,有助於演算法的擴充套件。
通過一個父類呼叫子類實現的操作,通過子類擴充套件增加新的行為,符合“開放-封閉原則”。
缺點
每個不同的實現都需要定義一個子類,這會導致類的個數的增加,設計更加抽象。
適用場景
在某些類的演算法中,用了相同的方法,造成程式碼的重複。
控制子類擴充套件,子類必須遵守演算法規則。