我看java設計模式之二————模板模式java
首先先舉個例子:算法
有一個咖啡店,來的人常常須要喝咖啡,而店員須要給這些人去衝咖啡。這個動做能夠簡單的分爲這麼幾步,設計模式
1,取杯子ide
2,倒入咖啡設計
3,倒入水code
4,攪拌。get
這樣的話一杯咖啡就衝好了。it
用代碼實現的話模板
class Waiter{ void getCoffee(){ getCup(); putCoffee(); putWater(); mix(); } void getCup(){ } void putCoffee(){ } void putWater(){ } void mix(){ } }
可是有一天,這個店還須要一個能倒茶的服務員,老闆就想,我總不能去又從新找一個專門倒茶的夥計吧,因而他就問我該怎麼辦,我說,這還不簡單,顧客須要茶的時候他就把咖啡換成茶不久能夠了,要是須要咖啡,就倒咖啡。class
這樣這個類會變成這樣:
abstract class Waiter{ void getUwant(){ getCup(); putSomeThing(); putWater(); mix(); } void getCup(){ } abstract void putSomeThing(); void putWater(){ } void mix(){ } }
而後,這個夥計會兩樣功夫,當須要咖啡的時候:
class CoffeeWaiter extends Waiter{ @Override void putSomeThing() { // TODO Auto-generated method stub System.out.println("我倒咖啡"); } } class TeaWaiter extends Waiter{ @Override void putSomeThing() { // TODO Auto-generated method stub System.out.println("我倒茶"); } }
這就是一個簡單的模板模式的應用:
下面來看概念:
概述
定義一個操做中的算法的骨架,而將步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義算法的某些特定步驟。
模式中的角色
抽象類(AbstractClass):實現了模板方法,定義了算法的骨架。
具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的算法。
類圖:
在以上的狀況下,對模板方法進行總結:
模板方法模式把不變的移到超類,去除子類重複代碼。
子類實現算法的某些細節,有助於算法的擴展。
經過一個父類調用子類實現的操做,經過子類擴展增長新的行爲,符合「開放-封閉原則」。
缺點
每一個不一樣的實現都須要定義一個子類,這會致使類的個數的增長,設計更加抽象。
適用場景
在某些類的算法中,用了相同的方法,形成代碼的重複。
控制子類擴展,子類必須遵照算法規則。