一、模板方法定义
定义一个操作中的某种算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类在不改变一个算法结构的前提下,对这些步骤进行个性化定义。
二、模板方法程序构成
在模板方法设计模式中,存在一个父类,其中包括两类方法:模板方法和步骤方法。
模板方法,即实现某种算法的方法步骤。而这些步骤都是调用的步骤方法完成的。
步骤方法,即完成模板方法的每个阶段性方法。每个步骤方法完成某一特定的、完成总算法的一部分功能。
步骤方法有三种类型:抽象方法、最终方法和钩子方法。
- 抽象方法:要求子类必须实现的方法,是完成模板方法的算法步骤中必须由子类完成的个性化定义。(一个抽象方法由抽象类声明、由其具体子类实现。)
- 最终方法:子类不能重写的方法,是若要完成模板方法的算法步骤,对于所有子类执行都一样的步骤。
- 钩子方法,是父类给出默认实现,但子类也可以重写的方法。(个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。通常在父类中给出的实现是一个空实现(可使用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 }
输出结果:
用户登录 购买运动鞋 使用支付宝支付 --------------- 用户登录 购买衣服 使用银联付款