行為型模式之模板方法模式(java版)
1.引入
模板方法模式就是當我們需要把某些細節層次,但器個別步驟的更詳細的實現卻是不同的時候,就需要用模板方法模式。實際上就是把一些更詳細的資訊在子類中去實現,這裡更詳細的資訊就是可變的資訊,因為每個子類都不同,所以具有可變資訊,然後把不變的行為給他封裝到父類中去,這樣就去除子類中重複的程式碼了。
2.舉例
一般我們做系統時都是照著軟體工程的思想,就是先做需求分析,然後概要設計,然後詳細設計,然後編碼,測試,釋出這幾個步驟,雖然每個系統都不一樣,但是我們的工作流程是不變的,只是步驟中某個細節可能會是不同的,如需求分析,不同的系統功能,需求分析肯定是不同的。在工作流程上是不變,而其細節上更詳細的設計是可變的,我們就採用模板方法模式。對於不同的系統都採用這個工作流程這套模板來設計。
3.實現
--3.1設計流程模板類:
//就是從需求分析到釋出系統的一套設計流程 public abstract class DesignCycle { public abstract void needAnalysis(); public abstract void conceptualDesign(); public abstract void detailedDesign(); public abstract void coding(); public abstract void testSystem(); public abstract void publishSystem(); public void templateDesignSystem(){ System.out.println("------------開始開發----------"); needAnalysis(); conceptualDesign(); detailedDesign(); coding(); testSystem(); publishSystem(); System.out.println("------------開發完畢-----------"); } }
--3.2.支付系統的實現類:
public class PaymentSystem extends DesignCycle{ @Override public void needAnalysis() { // TODO Auto-generated method stub System.out.println("支付系統的需求分析"); } @Override public void conceptualDesign() { // TODO Auto-generated method stub System.out.println("支付系統的概要設計"); } @Override public void detailedDesign() { // TODO Auto-generated method stub System.out.println("支付系統的詳細設計"); } @Override public void coding() { // TODO Auto-generated method stub System.out.println("支付系統的編碼"); } @Override public void testSystem() { // TODO Auto-generated method stub System.out.println("支付系統的測試"); } @Override public void publishSystem() { // TODO Auto-generated method stub System.out.println("支付系統的釋出"); } }
--3.3.物流系統的實現類:
//物流系統類
public class LogisticSystem extends DesignCycle{
@Override
public void needAnalysis() {
// TODO Auto-generated method stub
System.out.println("物流系統的需求分析");
}
@Override
public void conceptualDesign() {
// TODO Auto-generated method stub
System.out.println("物流系統的概要設計");
}
@Override
public void detailedDesign() {
// TODO Auto-generated method stub
System.out.println("物流系統的詳細設計");
}
@Override
public void coding() {
// TODO Auto-generated method stub
System.out.println("物流系統的編碼");
}
@Override
public void testSystem() {
// TODO Auto-generated method stub
System.out.println("物流系統的測試");
}
@Override
public void publishSystem() {
// TODO Auto-generated method stub
System.out.println("物流系統的釋出");
}
}
--3.4測試類:
public class Test {
public static void main(String[] args) {
DesignCycle dc;
dc=new PaymentSystem();
dc.templateDesignSystem();
dc=new LogisticSystem();
dc.templateDesignSystem();
}
}
結果:
------------開始開發----------
支付系統的需求分析
支付系統的概要設計
支付系統的詳細設計
支付系統的編碼
支付系統的測試
支付系統的釋出
------------開發完畢-----------
------------開始開發----------
物流系統的需求分析
物流系統的概要設計
物流系統的詳細設計
物流系統的編碼
物流系統的測試
物流系統的釋出
------------開發完畢-----------
---------------------------------------------------------------------------------------------------------------------------------------
總結1:
模板方法模式應用場景:當系統中存在不變的行為在子類中重複出現時,就將不變的行為和可變的行為分離,將不變的行為抽取出來放到一個單一的地方,讓子類們去實現這個單一的地方。避免了大量的重複程式碼,也同時為子類的設計做了一個統一的規範。
總結2:
具體的做法就是將重複不變的部分放在抽象父類中,然後讓子類們去繼承父類,然後重寫父類的抽象方法。
總結3:
模板方法模式的使用提高了程式碼的複用性。