模板方法設計模式


一、模板方法定義

   定義一個操作中的某種算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類在不改變一個算法結構的前提下,對這些步驟進行個性化定義。

二、模板方法程序構成

  在模板方法設計模式中,存在一個父類,其中包括兩類方法:模板方法和步驟方法。

 模板方法,即實現某種算法的方法步驟。而這些步驟都是調用的步驟方法完成的。

 步驟方法,即完成模板方法的每個階段性方法。每個步驟方法完成某一特定的、完成總算法的一部分功能。

步驟方法有三種類型:抽象方法、最終方法和鈎子方法。

  • 抽象方法:要求子類必須實現的方法,是完成模板方法的算法步驟中必須由子類完成的個性化定義。(一個抽象方法由抽象類聲明、由其具體子類實現。)
  • 最終方法:子類不能重寫的方法,是若要完成模板方法的算法步驟,對於所有子類執行都一樣的步驟。
  • 鈎子方法,是父類給出默認實現,但子類也可以重寫的方法。(個鈎子方法由一個抽象類或具體類聲明並實現,而其子類可能會加以擴展。通常在父類中給出的實現是一個空實現(可使用virtual關鍵字將其定義為虛函數),並以該空實現作為方法的默認實現,當然鈎子方法也可以提供一個非空的默認實現。)

三、Demo

 

 1 package com.jmu.service;
 2 
 3 public abstract class Shopping {
 4     // 模板方法
 5     public void buyGoods() {
 6         userLogin();
 7         buy();
 8         pay();
 9     }
10 
11     // 子類不能重寫的方法
12     public final void userLogin() {
13         // TODO Auto-generated method stub
14         System.out.println("用戶登錄");
15     }
16 
17     // 子類必須實現
18     public abstract void buy();
19 
20     // 鈎子方法
21     public void pay() {
22         // TODO Auto-generated method stub
23         System.out.println("使用支付寶支付");
24     }
25 }
 1 package com.jmu.service;
 2 
 3 public class ClothesShopping extends Shopping {
 4 
 5     @Override
 6     public void buy() {
 7         // TODO Auto-generated method stub
 8      System.out.println("購買衣服");
 9     }
10 
11     @Override
12     public void pay() {
13         // TODO Auto-generated method stub
14         System.out.println("使用銀聯付款");
15     }
16  
17 }
 1 package com.jmu.service;
 2 
 3 public class ShoesShopping extends Shopping {
 4 
 5     @Override
 6     public void buy() {
 7         // TODO Auto-generated method stub
 8       System.out.println("購買運動鞋");
 9     }
10 
11 }
 1 package com.jmu.service;
 2 
 3 public class MyTest {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         Shopping shoesShopping = new ShoesShopping();
 8         shoesShopping.buyGoods();
 9         System.out.println("---------------");
10         Shopping clothesShopping = new ClothesShopping();
11         clothesShopping.buyGoods();
12     }
13 
14 }

輸出結果:

用戶登錄
購買運動鞋
使用支付寶支付
---------------
用戶登錄
購買衣服
使用銀聯付款

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM