我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java设计模式-模板方法模式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java设计模式-模板方法模式

定义

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.

定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改
变一个算法的结构即可重定义该算法的某些特定步骤。

模板方法模式非常简单,主要是用了Java的继承机制,话不多说,直接上代码

实现

抽象模板类
public abstract class AbstractClass {        protected abstract void doSomething();        protected void doAnything() {        System.out.println("AbstractClass doAnything()");    }        public final void templateMethod(){        doSomething();        doAnything();    }}
具体模板类
public class ConcreteClassA extends AbstractClass {    @Override    protected void doSomething() {        System.out.println("ConcreteClassA doSomething()");    }    @Override    protected void doAnything() {        System.out.println("ConcreteClassA doAnything()->我不想使用父类的默认实现,我要覆盖它");    }}
public class ConcreteClassB extends AbstractClass {    @Override    protected void doSomething() {        System.out.println("ConcreteClassB doSomething()");    }        // 使用父类doAnything()的默认实现}
客户端代码
public class Client {    public static void main(String[] args) {        AbstractClass a = new ConcreteClassA();        a.templateMethod();        AbstractClass b = new ConcreteClassB();        b.templateMethod();    }}

优点

  • 封装不变部分,扩展可变部分
  • 提取公共部分代码,便于维护
  • 行为由父类控制,子类实现

缺点

  • 子类影响父类

    按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成

具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类
实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目
中,会带来代码阅读的难度,而且也会让新手产生不适感。

  • 模板方法使用继承方式复用代码,如果要在基本算法里面增加一个步骤,而该步骤是抽象的话,每个子类都要修改代码,实现这个步骤。

使用场景

  • 多个子类有公有的方法,并且逻辑基本相同时。
  • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个

子类实现。

  • 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通

钩子函数(详见后面的扩展示例)约束其行为。

扩展

模板方法模式的扩展,主要就是增加了钩子方法(Hook Method),那么什么是“钩子方法”呢?

在抽象模板类中,可以定义一个方法,并允许子类视情况覆盖它来改变基本方法的执行过程(比如决定某些步骤是否需要执行)

钩子方法的作用

  • 让子类实现算法中的可选部分,算法中的某些步骤是可选的,子类可以做出决定是否需要这些步骤
  • 如果钩子对于子类的实现不重要时,子类可以对钩子置之不理

下面是增加钩子方法后的模板方法模式通用代码:

抽象模板类
public abstract class AbstractClass {        protected abstract void doSomething();        protected void doAnything() {        System.out.println("AbstractClass doAnything()");    }        protected abstract void dependOnHook();        public final void templateMethod(){        doSomething();        doAnything();        if (hook()){            dependOnHook();        }    }        protected boolean hook(){        System.out.println("AbstractClass hook()");        return true;    }}
具体模板类
public class ConcreteClassA extends AbstractClass {    @Override    protected void doSomething() {        System.out.println("ConcreteClassA doSomething()");    }    @Override    protected void doAnything() {        System.out.println("ConcreteClassA doAnything()->我不想使用父类的默认实现,我要覆盖它");    }    @Override    protected void dependOnHook() {        System.out.println("ConcreteClassA dependOnHook()");    }    // 没有覆写钩子方法,使用默认实现,dependOnHook()将会被调用}
public class ConcreteClassB extends AbstractClass {    @Override    protected void doSomething() {        System.out.println("ConcreteClassB doSomething()");    }    // 使用父类doAnything()的默认实现    @Override    protected void dependOnHook() {        System.out.println("ConcreteClassB dependOnHook()");    }        @Override    protected boolean hook(){        System.out.println("ConcreteClassB hook()");        return false;    }}

源码地址:https://gitee.com/tianranll/java-design-patterns.git

参考文献《设计模式之禅》

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java设计模式-模板方法模式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java设计模式-模板方法模式

定义Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses
2023-06-05

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

这篇文章介绍了Java设计模式之模板方法模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

Java设计模式之模板方法模式TemplateMethodPattern详解

在我们实际开发中,如果一个方法极其复杂时,如果我们将所有的逻辑写在一个方法中,那维护起来就很困难,要替换某些步骤时都要重新写,这样代码的扩展性就很差,当遇到这种情况就要考虑今天的主角——模板方法模式
2022-11-13

怎么理解Java设计模式的模板方法模式

这篇文章主要讲解了“怎么理解Java设计模式的模板方法模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java设计模式的模板方法模式”吧!一、什么是模板方法模式模板方法模式在一个方
2023-06-25

Java设计模式之模板方法模式实例分析

本文小编为大家详细介绍“Java设计模式之模板方法模式实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式之模板方法模式实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。模板方法模式模板方
2023-06-29

PHP设计模式之模板方法模式TemplateMethodPattern详解

在我们实际开发中,如果一个方法极其复杂时,如果我们将所有的逻辑写在一个方法中,那维护起来就很困难,要替换某些步骤时都要重新写,这样代码的扩展性就很差,当遇到这种情况就要考虑今天的主角——模板方法模式
2022-12-20

设计模式二十三:模板方法模式(Template Method Pattern)

定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求 模版方法使用场景 算法框架固定,但具体步骤可以变化:当你有一个算法的整体结构是固定的,但其中某些步骤的实现
2023-08-30

模板方法模式

http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.htmlhttp://www.importnew.com/15546.htmlabstract class Abs
2023-06-03

简介Python设计模式中的代理模式与模板方法模式编程

代理模式 Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介 python的例子 你先设想:一个对象提供rg
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录