广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java设计模式之浅谈模板方法模式
  • 323
分享到

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

2024-04-02 19:04:59 323人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

一. 什么是模板方法设计模式 从字面意义上理解, 模板方法就是定义出来一套方法, 作为模板, 也就是基础。 在这个基础上, 我们可以进行加工,实现个性化的实现。比如:一日餐三. 早餐

一. 什么是模板方法设计模式

从字面意义上理解, 模板方法就是定义出来一套方法, 作为模板, 也就是基础。 在这个基础上, 我们可以进行加工,实现个性化的实现。比如:一日餐三. 早餐, 中餐, 晚餐. 每个人都要吃三餐, 但每个人的三餐吃的可能都不一样. 一日三餐定义了模板--早中晚, 每个人的三餐就是模板的具体实现.

1.1 模板方法的用途

将不变的行为从子类搬到超类,去除了子类中的重复代码。规范子类的结构

1.2 模板方法的定义

定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。

二. 定义模板方法的步骤

第一步: 定义模板类
第二步: 定义具体子类
第三步: 客户端调用

下面来了解每一个步骤:

2.1 定义模板类

通常模板类是抽象类,负责给出算法的轮廓或者框架。他是有若干个模板方法和若干个基本方法构成。

模板方法

定义了算法的骨架, 定义了方法调用的顺序, 其中包含一个或者多个基本方法

基本方法

基本算法有三种类型:

​a) 抽象方法:子类必须重写的方法。没有默认实现。

​b)具体方法:父类定义的默认实现,有实现逻辑,可以被具体的子类继承或重写

​c)钩子方法:判断的逻辑方法和需要子类重写的空方法两种。

2.2 定义具体子类

具体子类,也就是具体的实现类, 实现抽象类中的抽象方法。他们是抽象的模板方法中一个组成部分。

2.3 定义客户端调用

客户端调用抽象类, 实例化的时候实例化具体类, 只需要调用抽象类的模板方法就可以了。

2.4 下面来看一下抽象类和子类之间的UML图和源码实现

1.UML图

从图中可以看出抽象类的结构可以定义三类方法。 可以有一个也可以有多个。子类必须需要实现抽象类中的抽象方法,可以选择性重写父类的具体方法。子类实现接口的时候,要多思考设计模式的六大原则。

2.源码

先定义抽象类, 也就是框架。


package com.lxl.www.designPatterns.templatePattern.template;


public abstract class AbstractClass {

    
    public void templateMethod() {
        // 先调用具体方法
        specificMethod();
        // 在调用抽象方法
        abstractMethod();
    }

    
    public void specificMethod() {
        // 具体的公共逻辑, 父子类通用
        System.out.println("具体方法---父子类通用逻辑");
    }

    
    public abstract void abstractMethod();

}

在定义具体的实现类, 实现父类的抽象方法


package com.lxl.www.designPatterns.templatePattern.template;


public class ConcreteClass extends AbstractClass{

    
    @Override
    public void abstractMethod() {
        System.out.println("具体实现类--重写父类的抽象方法");
    }
}

最后定义客户端调用


package com.lxl.www.designPatterns.templatePattern.template;


public class TemplateClient {
    public static void main(String[] args) {
        AbstractClass abstractClass = new ConcreteClass();
        abstractClass.templateMethod();
    }
}

运行结果:

具体方法---父子类通用逻辑
具体实现类--重写父类的抽象方法

对照模板方法设计模式,我们来看一个具体的案例。

三、案例

1. 案例1: 一日规划

每个人的一日安排都有三餐, 早餐, 中餐,晚参。 但每个人的三餐食物不尽相同,我们来看看每个人的三餐变化, 以及三餐前后要做的事情。


package com.lxl.www.designPatterns.templatePattern.oneDayArrangement;


public abstract class ArrangementAbstract {

    
    public void templateMethod() {
        System.out.println("一日安排如下: ");
        getUp();
        breakfast();
        lunch();
        dinner();
        getDown();
    }

    public void getUp() {
        System.out.println("起床");
    }

    public void getDown() {
        System.out.println("睡觉");
    }

    
    public abstract void breakfast() ;

    
    public abstract void lunch();

    
    public abstract void dinner();

}

定义一日三餐抽象类。每个人的日程安排都是,起床,早餐,中餐,晚餐,睡觉。 其中起床和睡觉是每个人都要做的事情,三餐也是,但三餐的食物不同,于是我们将三餐定义为抽象

一日安排实现类


package com.lxl.www.designPatterns.templatePattern.oneDayArrangement;


public class PersonArrangement extends ArrangementAbstract{
    private String name;
    public PersonArrangement(String name) {
        this.name = name;
    }

    
    public void breakfast(){
        System.out.println(name + "--早餐吃牛奶面包");
    }

    
    public void lunch() {
        System.out.println(name + "--中餐吃食堂");
    }

    
    public void dinner() {
        System.out.println(name + "--晚餐吃水果");
    }

}

客户端调用


public class Client {
    public static void main(String[] args) {
        ArrangementAbstract zhangsan = new PersonArrangement("张三");
        zhangsan.templateMethod();
    }
}

运行结果:

一日安排如下:
起床
张三--早餐吃牛奶面包
张三--中餐吃食堂
张三--晚餐吃水果
睡觉

可以看出, 完全按照模板方法的步骤实现。

2. 案例2: 钩子方法

我们上面说了, 模板方法设计模式中, 基本方法包括抽象方法,具体方法和钩子方法.
如果能够使用好钩子方法, 可以在程序中完美实现子类控制父类的行为. 我们来看下面的案例:

我们在抽象方法中定义一个钩子方法hookMethod(), 在模板方法templateMethod()中,钩子方法控制了代码的流程.

UML图:

源代码:


package com.lxl.www.designPatterns.templatePattern.hookMethod;


public abstract class AbstractClass {

    
    public void templateMethod() {
        // 调用具体方法
        specificMethod();
        // 钩子方法控制下一步骤
        if (hookMethod()) {
            // 调用抽象方法
            abstractMethod();
        }
    }

    
    public void specificMethod() {
        // 具体的公共逻辑, 父子类通用
        System.out.println("具体方法---父子类通用逻辑");
    }

    
    public boolean hookMethod() {
        return true;
    }

    
    public abstract void abstractMethod();

}

定义具体实现



public class ConcreteClass extends AbstractClass {

    
    @Override
    public void abstractMethod() {
        System.out.println("具体实现类--重写父类的抽象方法");
    }

    
    @Override
    public boolean hookMethod() {
        System.out.println("重写了父类的钩子方法, 反向控制父类的行为");
        return false;
    }
}

重写了钩子方法, 反向控制父类的行为


public class TemplateClient {
    public static void main(String[] args) {
        AbstractClass abstractClass = new ConcreteClass();
        abstractClass.templateMethod();
    }
}

运行结果

具体方法---父子类通用逻辑
重写了父类的钩子方法, 反向控制父类的行为

如果子类钩子方法 HookMethod() 的代码改变,则程序的运行结果也会发生改变。

四. 模板方法的优缺点

4.1 优点

1.规范了框架, 封装了不变的部分, 扩展了可变的部分. 父类定义框架, 并抽象了公共不变的部分, 子类通过重写扩展完善了框架的实现.

2.使用了"开闭原则", 对扩展开放, 对修改关闭. 子类可以通过重写父类的抽象方法来扩展父类的实现.

3.行为集中有父类控制, 规范流程

4.2 缺点

1.每一种实现都需要定义一个具体实现类, 增加类的数量, 系统更加复杂

2.继承的缺点, 一旦父类增加一个抽象方法, 所有子类都需要增加. 这一点违背"开闭原则".

3.父类中的抽象方法由子类实现, 子类的执行结果影响父类, 这种"反向控制"结构, 会增加代码的复杂性。

五. 使用场景

1.算法的整体步骤是固定的,但个别部分容易发生变化时,可以考虑使用模板方法设计模式,将容易发生变化的部分抽象出来,提供给子类去实现。

2.当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

3.当需要控制子类的扩展时,模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。

4.重构时,模板方法模式是一个经常使用到的模式,把相同的代码抽取到父类中,通过钩子函数约束其行为

六. 对设计模式六大原则的应用思考

1.单一职责原则: 一个方法只有一个引起变化的原因, 这个不太好看出, 要开子类代码的具体实现

2.里式替换原则: 父类出现的地方都可以使用子类替换,并且结果保持一致. 子类重写了父类的方法。 模板方法设计模式可能违背里式替换原则, 不过,这正是能够“反向控制”的原理

3.接口隔离原则: 依赖于最小的单一接口, 而不是胖接口. 符合

4.依赖倒置原则: 依赖于抽象, 而不是依赖于具体. 符合

5.迪米特法则: 最少知识原则. 之和朋友沟通, 减少和朋友的沟通. 这个需要看子类具体实现是否符合

6.开闭原则: 违背开闭原则, 一旦父类增加一个抽象方法, 所有子类都需要对应增加

到此这篇关于Java设计模式之浅谈模板方法模式的文章就介绍到这了,更多相关Java模板方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java设计模式之浅谈模板方法模式

本文链接: https://www.lsjlt.com/news/128896.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java设计模式之浅谈模板方法模式
    一. 什么是模板方法设计模式 从字面意义上理解, 模板方法就是定义出来一套方法, 作为模板, 也就是基础。 在这个基础上, 我们可以进行加工,实现个性化的实现。比如:一日餐三. 早餐...
    99+
    2022-11-12
  • Java设计模式之模板方法模式
    在我们实际开发中,如果一个方法极其复杂时,如果我们将所有的逻辑写在一个方法中,那维护起来就很困难,要替换某些步骤时都要重新写,这样代码的扩展性就很差,当遇到这种情况就要考虑今天的主角...
    99+
    2022-11-13
    Java 设计模式 模板方法模式
  • Java设计模式之浅谈外观模式
    目录简介外观模式之理解实例①、定义子系统②、外观类③、测试好文推荐简介 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类...
    99+
    2022-11-13
  • java设计模式之浅谈适配器模式
    目录一、结构型模式二、适配器模式三、什么是适配器模式?四、角色分析五、对象适配器有哪些优点六、类适配器缺点七、使用场景一、结构型模式 结构型模式有什么好处? 从程序的结构上实现松耦合...
    99+
    2022-11-12
  • Java设计模式之模板方法模式详解
    目录模板方法模式模板方法模式的优缺点使用场景总结模板方法模式 模板方法模式法(Template Method)定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不...
    99+
    2022-11-13
  • Java设计模式之java模板方法模式详解
    目录模板方法模式介绍角色代码演示模板方法模式总结优点缺点适用场景源码分析模板方法模式的典型应用Servlet 中的模板方法模式Hello World!Spring中的IOC容器启动—...
    99+
    2022-11-12
  • Java设计模式-模板方法模式
    定义Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subcl...
    99+
    2023-06-05
  • Java设计模式之模板方法模式TemplateMethodPattern详解
    目录概述模板方法模板方法模式好莱坞原则好莱坞原则与依赖倒置原则真实案例模板方法模式的注意事项和细节概述 模板方法 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。那...
    99+
    2022-11-13
    Java模板方法模式 Java Template Method Pattern
  • Java设计模式之模板方法详解
    目录概念核心设计要点优缺点应用场景模板方法和策略模式的区别代码案例概念 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系。因此,在模板方法...
    99+
    2022-11-13
  • 浅谈PHP设计模式之门面模式Facade
    目录目的UML代码测试目的 Facade通过嵌入多个(当然,有时只有一个)接口来解耦访客与子系统,同时也为了降低复杂度。 Facade 不会禁止你访问子系统 你可以...
    99+
    2022-11-12
  • 深入理解Java设计模式之模板方法模式
    目录一、什么是模板方法模式二、模板方法模式的使用场景三、模板方法模式的优缺点四、模板方法模式的实现五、总结一、什么是模板方法模式 模板方法模式在一个方法中定义一个算法的骨架,而将一些...
    99+
    2022-11-12
  • Java设计模式之模板方法模式实例分析
    本文小编为大家详细介绍“Java设计模式之模板方法模式实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式之模板方法模式实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。模板方法模式模板方...
    99+
    2023-06-29
  • 浅谈Java设计模式之原型模式知识总结
    如何使用? 1.首先定义一个User类,它必须实现了Cloneable接口,重写了clone()方法。 public class User implements Cloneabl...
    99+
    2022-11-12
  • 浅谈PHP设计模式之对象池模式Pool
    目录目的UML 类图代码测试目的 在初始化实例成本高,实例化率高,可用实例不足的情况下,对象池可以极大地提升性能。在创建对象(尤其是通过网络)时间花销不确定的情况下,通过对象池在可期...
    99+
    2022-11-12
  • PHP设计模式之模板方法模式TemplateMethodPattern详解
    目录简介适用场景优点缺点其它代码简介 模板方法模式,是行为型的设计模式。 定义一个操作中的算法的骨架,而将一些步骤延迟到子类当中,使得子类可以不改变一个算法的结构即可重新定义该算法的...
    99+
    2022-12-20
    PHP设计模式之模板方法模式 PHP模板方法模式
  • 浅谈Java设计模式之七大设计原则
    目录前言一、单一职责原则(SingleResponsibilityPrinciple,SRP)二、开闭原则(Open-ClosedPrinciple,OCP)三、里氏代换原则(Lis...
    99+
    2022-11-12
  • 分析设计模式之模板方法Java实现
    目录一、什么是模板方法设计模式1.1、模板方法的用途1.2、模板方法的定义二、定义模板方法的步骤2.1、定义模板类2.2、定义具体子类2.3、定义客户端调用2.4 下抽象类和子类之间...
    99+
    2022-11-12
  • Java行为型设计模式之模板方法详解
    目录模板方法模式应用场景主要角色优缺点模板方法模式的基本使用创建抽象模板角色创建具体实现客户端调用模板方法模式 模板方法模式属于行为型设计模式。它是指定义一个操作中的算法的框架,而将...
    99+
    2022-11-13
  • .Net行为型设计模式之模板方法模式(Template Method)
    目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、模板方法模式的具体实现六、模板方法模式的实现要点:1、模板方法模式适用情形:2、模板方法模式特点:...
    99+
    2022-11-13
  • 怎么理解Java设计模式的模板方法模式
    这篇文章主要讲解了“怎么理解Java设计模式的模板方法模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java设计模式的模板方法模式”吧!一、什么是模板方法模式模板方法模式在一个方...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作