模板方法设计模式

Posted hoje

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板方法设计模式相关的知识,希望对你有一定的参考价值。

一、模板方法定义

   定义一个操作中的某种算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类在不改变一个算法结构的前提下,对这些步骤进行个性化定义。

二、模板方法程序构成

  在模板方法设计模式中,存在一个父类,其中包括两类方法:模板方法和步骤方法。

 模板方法,即实现某种算法的方法步骤。而这些步骤都是调用的步骤方法完成的。

 步骤方法,即完成模板方法的每个阶段性方法。每个步骤方法完成某一特定的、完成总算法的一部分功能。

步骤方法有三种类型:抽象方法、最终方法和钩子方法。

  • 抽象方法:要求子类必须实现的方法,是完成模板方法的算法步骤中必须由子类完成的个性化定义。(一个抽象方法由抽象类声明、由其具体子类实现。)
  • 最终方法:子类不能重写的方法,是若要完成模板方法的算法步骤,对于所有子类执行都一样的步骤。
  • 钩子方法,是父类给出默认实现,但子类也可以重写的方法。(个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。通常在父类中给出的实现是一个空实现(可使用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 }

输出结果:

用户登录
购买运动鞋
使用支付宝支付
---------------
用户登录
购买衣服
使用银联付款

  

以上是关于模板方法设计模式的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

Eclipse 中的通用代码片段或模板