设计模式之模板方法模式(行为型)

目录

  • 一、模式定义
  • 二、模式角色
  • 三、模式分析
  • 四、具体例子
  • 五、模式应用场景

一、模式定义

模板方法模式就是在一个抽象类中定义一些骨架方法,然后通过类继承的方法,将一些方法延迟到继承类里。模板方法模式是一种类行为型模式,是一种比较常用的方法。不属于对象行为型模式,因为只是通过类继承实现。

Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm‘s structure.

二、模式角色

  • AbstractClass(抽象类)
  • ConcreteClass(实现类)

三、模式分析

模板方法,将基本方法封装组合在一个抽象类中形成一个总算法或者说一个总行为的方法。

模板方法的组成部分:

  • 抽象方法(Abstract Method)
  • 具体方法(Concrete Method)
  • 钩子方法(HookMethod)

抽象类代码:

public abstract class AbstractClass
{
    public void templateMethod()  //模板方法
    {
        primitiveOperation1();
        primitiveOperation2();
        primitiveOperation3();
    }
    public void operation1()    //基本方法-具体方法
    {
        //实现代码
    }
    public abstract void operation2();    //基本方法-抽象方法
    public void operation3()    //基本方法-钩子方法
    {
    }
}

具体实现类代码:

public abstract class ConcreteClass
{
   /**
    * 基本方法-抽象方法
    */
    public abstract void operation2(){
        //具体实现
    }    

    /**
    * 基本方法-钩子方法
    */
    public void operation3(){
        //具体实现
    }
} 

子类不显性调用父类的方法,而是通过继承的方法来实现具体的业务方法,也就是说父类控制子类的调用,这种机制叫好莱坞原则。好莱坞原则的定义为:“不要给我们打电话,我们会给你打电话(Don‘t call us, we’ll call you)”。

四、具体例子

数据库操作的例子。数据库操作分为连接、打开、使用、关闭步骤。现在要使用mysql、oracle、db2等等关系型数据库进行数据库操作工具类的编写。而对于使用这几种不同的数据库,其实只是连接的代码不同,而其它操作的代码都是差不多的,所以可以使用模板方法进行代码复用。

ps:这个例子来自《设计模式》一书,稍微改了一点

模板方法

public abstract class DBOperator
{
//抽象方法
    public abstract void connDB();
    public void openDB()
    {
        System.out.println("打开数据库");
    }
    public void useDB()
    {
        System.out.println("使用数据库");
    }
    public void closeDB()
    {
        System.out.println("关闭数据库");
    }
    //模板方法
   public void process()
   {
    connDB();
    openDB();
    useDB();
    closeDB();
   }
}

mysql数据库

public class DBOperatorMysql extends DBOperator
{
    public void connDB()
    {
        System.out.println("使用JDBC-ODBC桥接连接Mysql数据库");
    }
}

Oracle数据库

public class DBOperatorOracle extends DBOperator
{
    public void connDB()
    {
        System.out.println("使用JDBC-ODBC桥接连接Oracle数据库");
    }
}

调用


class Client
{
    public static void main(String a[])
    {
        DBOperator db1;

        db1=new DBOperatorMysql();
        db1.process();
        db1=new DBOperatorOracle();
        db1.process();
    }
}

五、模式应用场景

  • Spring、Struts2框架的应用,比如框架的初始化就有应用

    ...

原文地址:https://www.cnblogs.com/mzq123/p/10202495.html

时间: 2024-11-01 16:22:28

设计模式之模板方法模式(行为型)的相关文章

设计模式 ( 二十 ): Template method模板方法模式 -- 行为型

  1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->办理具体业务->对银行工作人员进行评分.取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能取款.存款或者转账. 2.问题 如何保证架构逻辑的正常执行,而不被子类破坏 ? 3.

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

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

【设计模式】模板方法模式

模板方法模式 一个父类[运动会]类 两个子类,一个[CClass1]类,一个[CClass2]类,班级类是运动会类的子类,父类制定了运动会的流程(算法的逻辑架构),子类分别去实现流程中的具体实现. 子类不需要重写流程,只需要重写流程中每一项的具体内容. 以此为例,流程就是先干什么.后干什么.再干什么,而每一项就是分别干的内容. /************************************************************************ 设计模式 模板方法模式

【设计模式】——模板方法模式

模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤.当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理. AbstractClas是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法.这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现.顶级逻辑也有可能调用一些具体

【大话设计模式】—— 模板方法模式

一.概念 上一篇文章刚刚讲了[大话设计模式]-- 原型模式,原型模式主要是通过Clone()方法,创建新的对象,免去了初始化的过程.模板方法模式也特别会"偷工减料",把不变的行为搬移到超类,去除子类中的重复代码,将代码的复用优势展现的淋漓尽致.它为我们提供了特定的结构和样式,我们只需关心填充数据内容就好,省心啊- 下面让我们来看一下它的准确定义: 模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构

大话设计模式_模板方法模式(Java代码)

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 简单描述:多个类的行为是差不多的,只是某些局部不一样,则交由父类中抽象出这些子类中相同的部分,父类中定义出不同的部分的接口(方法),这些不同部分的方法则由子类去实现,通过多态,实现代码的重用 大话设计模式中的截图: 例子代码: AbstractClass类: 1 package com.longsheng.templatemethod; 2 3 public

设计模式(8)--模板方法模式

关键词 :hook 钩子    Applet 中 init() destory() 为钩子,需要子类去实现. 新原则: 别调用我们,我们会调用你们    高层调用低层   低层不能调用高层. 目的 :封装算法 模板方法:子类决定如何实现算法中的步骤 策略:封装可互换的行为,然后使用委托来决定要采用哪一个行为 工厂方法:由子类决定实例化哪个具体类 OO原则:新原则上面 OO模式:模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类.模板方法使得子类可以在不改变算法的结构的情况下,重

Java设计模式之模板方法模式或者说模板设计模式(属于行为型)

抽象类,不变的代码写了,要变化的部分留给子类去实现: package 行为型_模板方法模式; //模板设计模式的意思是把不变定位部分写出来,变化的部分留给子类去实现 public abstract class GetTime { public long getTime() throws Exception{ long start = System.currentTimeMillis();//开始时间 /* //for循环 for(int i=0;i<10000;i++){ System.out.

java设计模式之模板方法模式

注意 本博客摘录于秦小波老师写的<设计模式之禅> 模板方法模式 汽车厂造悍马 假设我们是一个汽车公司,现在有客户来了,要求我们造悍马! 既然上级下来命令那就造呗,但是造悍马你得告诉我们汽车有什么功能啊,客户说了:"能启动车,能停止车,能响,能跑."好,功能出来了,开始造汽车了.类图如下: 抽象悍马模型代码如下: public abstract class HummerModel { /* * 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正 * 是要能够发