GOF23设计模式之模板方法模式(template method)

一、模板方法模式概述

  模板方法模式是编程中经常使用的模式。它定义了一种操作中的算法架构,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。

  (1)核心:

      处理某个流程的代码已经都定义好了,但是其中某个节点的代码暂时不能确定,因此,采用模板方法模式,将这个节点的代码转移到子类完成。

    即:处理步骤在父类中定义好,具体实现延迟到子类中定义。

  (2)什么时候采用模板方法模式?

      实现一个算法,整体步骤很固定,但是,某些部分需要经常改变,所以把这部分抽象出来,供子类实现。

二、模板方法模式场景导入

  客户到银行办理业务:

    (1)取号排队

    (2)办理具体取款/存款/理财等业务

    (3)反馈评分

  第一步和第三步固定,第二步易变,所以采用模板方法模式实现。

三、模板方法模式示例代码

 1 /**
 2  * 抽象的模板方法类
 3  * @author CL
 4  *
 5  */
 6 public abstract class BankTemplateMethod {
 7     /**
 8      * 具体实现方法:排队取号
 9      */
10     public void takeNumber() {
11         System.out.println("排队取号");
12     }
13
14     /**
15      * 抽象方法:办理业务
16      * 钩子方法
17      */
18     public abstract void transact();
19
20     /**
21      * 具体方法:反馈评分
22      */
23     public void evaluate() {
24         System.out.println("反馈评分");
25     }
26
27     /**
28      * 模板方法,将所有操作组合起来,一般子类不能重写
29      */
30     public final void process() {
31         this.takeNumber();
32
33         this.transact();    //钩子方法。执行时,挂在哪个子类的方法上就执行哪个方法
34
35         this.evaluate();
36     }
37 }
 1 /**
 2  * 取款业务
 3  * @author CL
 4  *
 5  */
 6 public class DrawMoney extends BankTemplateMethod {
 7
 8     @Override
 9     public void transact() {
10         System.out.println("我要取款");
11     }
12
13 }

  测试:

 1 /**
 2  * 测试模板方法模式
 3  * @author CL
 4  *
 5  */
 6 public class Client {
 7
 8     public static void main(String[] args) {
 9         //模板方法模式的三种实现方式
10
11         //第一种
12         BankTemplateMethod btm = new DrawMoney();
13         btm.process();
14
15         System.out.println("---------------------");
16         //第二种     使用匿名内部类
17         BankTemplateMethod btm2 = new BankTemplateMethod() {
18
19             @Override
20             public void transact() {
21                 System.out.println("我要存款");
22             }
23         };
24
25         btm2.process();
26
27         System.out.println("---------------------");
28
29         //第三种
30         new BankTemplateMethod() {
31
32             @Override
33             public void transact() {
34                 System.out.println("我要理财");
35             }
36
37         }.process();
38     }
39 }
排队取号
我要取款
反馈评分
---------------------
排队取号
我要存款
反馈评分
---------------------
排队取号
我要理财
反馈评分

四、方法回调(钩子方法)

  (1)好莱坞原则 (Don‘t call me, we‘ll call you back)

  (2)在软件开发中,我们可以将call翻译为调用。子类不能调用父类,而通过父类调用子类。这些调用步骤已经在父类中写好,完全由父类控制整个过程。

五、模板方法模式常见开发应用场景

  (1)数据库访问的封装;

  (2)servlet 中关于 doGet / doPost 方法调用;

  (3)Junit 单元测试;

  (4)Hibernate 中模板程序;

  (5)Spring 中 JDBCTemplate、HibernateTemplate 等;

  (6)…………

原文地址:https://www.cnblogs.com/cao-lei/p/8334918.html

时间: 2024-11-13 09:55:16

GOF23设计模式之模板方法模式(template method)的相关文章

设计模式之模板方法模式(Template Method)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式 - 模板方法模式(template method pattern) JFrame 详解

模板方法模式(template method pattern) JFrame 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), Java的JFrame使用模板方法模式, paint()是可以覆盖的方法,

设计模式 - 模板方法模式(template method pattern) Applet 详解

模板方法模式(template method pattern) Applet 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), applet就是一个能够在网页上面执行的小程序, applet有很多钩子(

设计模式 - 模板方法模式(template method pattern) 排序(sort) 详解

模板方法模式(template method pattern) 排序(sort) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个主要的应用是排序(sort)算法. 对象的排列方式并不是完全相同, 所以需要排序(sort)算法compareTo()

设计模式 - 模板方法模式(template method pattern) 详解

模板方法模式(template method pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template method pattern): 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下, 重新定义算法中的某些步骤. 模板方法可以进行挂钩(hook), 钩子(hook)是一种被声明在抽象类中的方法, 但只有空的或者默认的实现. 钩子的存在, 可以让子类有能力

设计模式 - 模板方法模式(template method pattern) JFrame 具体解释

模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), Java的JFrame使用模板方法模式, paint()是能够覆盖的方

设计模式 - 模板方法模式(template method pattern) Applet 具体解释

模板方法模式(template method pattern) Applet 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), applet就是一个可以在网页上面运行的小程序, applet有非常多

设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释

模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个基本的应用是排序(sort)算法. 对象的排列方式并非全然同样, 所以须要排序(sort)算法compareTo(

模板方法模式-Template Method

模板方法模式-Template Method 由子类实现具体, 由模板提供调度执行 Template接口 public interface Template { void before(); void run(); void after(); default void execute() { before(); run(); after(); } } TemplateImpl类 这是一个模板的实现类 public class TemplateImpl implements Template {