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

栏目: 后端 · 发布时间: 5年前

内容简介:本文简单讲述了模板方法模式,例子为如何使作文模板来写作文。如果想进一步,了解模板方法,建议读完后阅读一下spring中AbstractApplicationContext类的refresh方法或HttpServelt类中的service方法。定义:模板方法模式(Template method pattern)是一种类的行为设计模式。该模式会在父类的一个操作中定义算法的结构,然后将具体实现推迟到子类中完成。可以让子类重新定义某些方法的实现而不改变原来的算法结构。

本文简单讲述了模板方法模式,例子为如何使作文模板来写作文。如果想进一步,了解模板方法,建议读完后阅读一下spring中AbstractApplicationContext类的refresh方法或HttpServelt类中的service方法。

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

一、概念

定义:模板方法模式(Template method pattern)是一种类的行为设计模式。该模式会在父类的一个操作中定义算法的结构,然后将具体实现推迟到子类中完成。可以让子类重新定义某些方法的实现而不改变原来的算法结构。

当然,父类可以实现该算法结构的某些方法,将剩余逻辑交给子类实现,不同的子类有不同的实现。

模板方法模式是最常被使用的 设计模式 之一,在Servlet里,记不记的我们要继承一个HttpServlet类,然后需要重写doPost()和doGet()方法。还有那个Spring的IoC容器的初始化方法中refresh()就是一个典型的模板方法,这里面obtainFreshBeanFactory()是抽象方法,postProcessBeanFactory()和onRefresh()是钩子方法。

二、结构

UML图:

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

主要组成部分:

抽象模板类(Template):会定义一个模板方法,模板方法往往是一个具体方法,给出一个固定的方法调用顺序,其中的抽象方法会推迟到子类中实现。

  1. Template:模板方法,会定义一个逻辑骨架
  2. method01:具体方法,在抽象类中就给出了实现,如果不想让子类修改,可以给方法加上final
  3. method02:抽象方法,推迟到子类中实现,在不同的子类中可以有不同的实现
  4. hook:钩子方法,抽象类给出了默认实现,子类也可以根据需要对该方法进行重写

抽象类实现(SubClass):模板类中的抽象方法会在子类中实现,不同的子类中算法会有不同的实现,其中SubClass2选择了重写hook方法,而SubClass1选择了抽象类中默认实现。

三、谁又没背过几篇作文模板呢?

都是应试教育过来的人,想必大家都背过几个作文模板吧~哈哈,接下来,我们就用模板方法模式做一个简单的作文模板!

这是个作文模板,也就是模板方法模式里面的抽象类,start和end都是钩子方法,content是抽象方法,需要推迟到子类中实现

public abstract class CompositionTemplate {
    public void template(){
        start();
        content();
        end();
    }

    public void start(){
        System.out.println("As far as I am concerned,");
    }
    public void end(){
        System.out.println("In a word,");
    }
    public abstract void content();
}

一篇关于保护环境的文章

public class Composition1 extends CompositionTemplate {
    @Override
    public void content() {
        System.out.println("李华认为保护环境很重要!");
    }
}

一篇关于经济的文章

public class Composition2 extends CompositionTemplate {
    @Override
    public void content() {
        System.out.println("小白认为经济发展更重要!");
    }
}

搞起来~

public class Test {
    public static void main(String[] args) {
        CompositionTemplate composition1 = new Composition1();
        CompositionTemplate composition2 = new Composition2();

        composition1.template();
        System.out.println("--------------");
        composition2.template();
    }
}

------>
    
As far as I am concerned,
李华认为保护环境很重要!
In a word,
--------------
As far as I am concerned,
小白认为经济发展更重要!
In a word,

看有了模板之后,我们只需要在不同的文章里将中间的content部分重写就可以了,如果同学姿势水平比较高,那就连开头结尾的两个钩子方法也重写了,哈哈~

我自己写这个模板方法,不要太简单,大家如果感兴趣,我强烈建议看一下HttpServlet里面的service方法,这是一个很经典模板方法模式,里面的doPost、doGet、doDelete等等,都是钩子方法,在抽象类里有默认实现,在子类中可以重写。

另外,值得注意的是,钩子方法的命名规则是doXXX,这是熟悉设计模式的开发人员的默认做法,以后如果使用钩子方法时,记得这样命名,你和其他开发人员就更方便沟通了~

四、优缺点

优点

  • 提高代码的复用性,相同的逻辑部分会在抽象类中实现
  • 提高代码扩展性,将不同部分放入子类,如果需要扩展,可以添加新的子类
  • 符合好莱坞原则,由抽象类主控一切,子类绝不直接调用抽象类。

缺点

  • 引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。

五、总结

模板方法模式是经常用到的一种设计模式,但也是很容易理解的一种模式。重点在抽象模板类中的模板方法主控一切,需要改变的抽象方法推迟到子类中完成。

值得注意的是,不要与策略模式混淆,策略模式同样也是封装算法,但是策略模式是封装整个算法,而模板方法模式是将需要改变的部分在子类中实现;策略方法使用组合,而模板方法是使用继承。

本文首发于cdream个人博客

欢迎转载,转载请注明出处!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

电脑报(上下册)

电脑报(上下册)

电脑报社 / 西南师范大学出版社 / 2006-12-01 / 45.00元

全套上、下两册,浓缩2006年电脑报精华文章。附录包含70余篇简明IT应用指南,覆盖软件、硬盘、数码、网络四大领域。配赠权威实用的2006-2007中国计算机年鉴DVD光盘,近1.4GB海量信息与资源超值奉献。8大正版超值软件,涵盖系统维护、系统安全、办公应用、多媒体娱乐等四大领域。微软、腾讯、友立等知名厂商,新年献礼。提供2006-2007全系列硬件、数码产品资讯,兼具知识性与资料性。官方网站全......一起来看看 《电脑报(上下册)》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具