一、模板方法定義 定義一個操作中的某種演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類在不改變一個演算法結構的前提下,對這些步驟進行個性化定義。 二、模板方法程式構成 在模板方法設計模式中,存在一個父類,其中包括兩類方法:模板方法和步驟方法。 模板方法,即實現某種演算法的方法步驟。而這些步驟都 ...
一、模板方法定義
定義一個操作中的某種演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類在不改變一個演算法結構的前提下,對這些步驟進行個性化定義。
二、模板方法程式構成
在模板方法設計模式中,存在一個父類,其中包括兩類方法:模板方法和步驟方法。
模板方法,即實現某種演算法的方法步驟。而這些步驟都是調用的步驟方法完成的。
步驟方法,即完成模板方法的每個階段性方法。每個步驟方法完成某一特定的、完成總演算法的一部分功能。
步驟方法有三種類型:抽象方法、最終方法和鉤子方法。
- 抽象方法:要求子類必須實現的方法,是完成模板方法的演算法步驟中必須由子類完成的個性化定義。(一個抽象方法由抽象類聲明、由其具體子類實現。)
- 最終方法:子類不能重寫的方法,是若要完成模板方法的演算法步驟,對於所有子類執行都一樣的步驟。
- 鉤子方法,是父類給出預設實現,但子類也可以重寫的方法。(個鉤子方法由一個抽象類或具體類聲明並實現,而其子類可能會加以擴展。通常在父類中給出的實現是一個空實現(可使用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 }
輸出結果:
用戶登錄 購買運動鞋 使用支付寶支付 --------------- 用戶登錄 購買衣服 使用銀聯付款