模板模式

news2024/11/19 9:21:58

文章目录

    • 思考模板模式
      • 1.模板模式的本质
      • 2.何时选用模板模式
      • 3.优缺点
      • 4.模板方法的结构
      • 5.实现

思考模板模式

模板模式其实就是抽离共用方法到抽象类中,然后再规定其具体实现步骤

1.模板模式的本质

模板方法模式的本质:固定算法骨架。

模板方法模式主要是通过制定模板,把算法步骤固定下来,至于谁来实现,模板可以自己提供实现,也可以由子类去实现,还可以通过回调机制让其他类来实现。
通过固定算法骨架来约束子类的行为,并在特定的扩展点来让子类进行功能扩展,从而让程序既有很好的复用性,又有较好的扩展性。

2.何时选用模板模式

建议在以下情况中选用模板方法模式。

  • 需要固定定义算法骨架,实现一个算法的不变的部分,并把可变的行为留给子类来实现的情况。
  • 各个子类中具有公共行为,应该抽取出来,集中在一个公共类中去实现,从而避免代码重复。
  • 需要控制子类扩展的情况。模板方法模式会在特定的点来调用子类的方法,这样只允许在这些点进行扩展。

3.优缺点

优点

  • 模板方法模式的优点是实现代码复用。
    模板方法模式是一种实现代码复用的很好的手段。通过把子类的公共功能提炼和抽取,把公共部分放到模板中去实现。

  • 模板方法模式的缺点是算法骨架不容易升级。
    模板方法模式最基本的功能就是通过模板的制定,把算法骨架完全固定下来。事实上模板和子类是非常耦合的,如果要对模板中的算法骨架进行变更,可能就会要求所有相关的子类进行相应的变化。所以抽取算法骨架的时候要特别小心,尽量确保是不会变化的部分才放到模板中。

4.模板方法的结构

在这里插入图片描述

  • AbstractClass:抽象类。用来定义算法骨架和原语操作,具体的子类通过重定义这些原语操作来实现一个算法的各个步骤。在这个类里面,还可以提供算法中通用的实现。
  • ConcreteClass:具体实现类。用来实现算法骨架中的某些步骤,完成与特定子类相关的功能。

原语操作:即是抽象的操作,必须由子类提供实现
钩子操作:即是在模板中定义,并提供默认实现的操作,子类可以选择性重写

5.实现

定义一个oppo手机模板类,所有机型都使用的是oppo电池,但是使用的芯片不同,所以电池方法在模板类实现,芯片方法各个机型实现自己的。
在这里插入图片描述

模板及其实现类,模板方法设置为 final,防止被恶意重写

/**
 * @description:手机模板类
 */
public abstract class Phone {

    /**
     * 钩子操作
     * 安装电池
     */
     void initBattery(){
         System.out.println("安装oppo电池");
     }

    /**
     * 原语操作
     * 安装处理器
     */
    abstract void initProcessor();

    /**
     * 初始化手机
     */
    public final void init(){
        initBattery();
        initProcessor();
    }
}

/**
 * @description:OppoReno9 机型手机
 */
public class OppoReno9 extends Phone{

    @Override
    void initProcessor() {
        System.out.println("使用高通骁龙778G处理器");
    }
}

/**
 * @description:OppoReno9Pro 机型手机
 */
public class OppoReno9Pro extends Phone {

    @Override
    void initProcessor() {
        System.out.println("使用天玑 8100-MAX处理器");
    }
}

测试类

/**
 * @description:测试类
 */
public class Client {

    public static void main(String[] args) {
        Phone oppoReno9 = new OppoReno9();
        oppoReno9.init();

        Phone OppoReno9Pro = new OppoReno9Pro();
        oppoReno9.init();
    }
}

结果

安装oppo电池
使用高通骁龙778G处理器
安装oppo电池
使用高通骁龙778G处理器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统集成企业需具备哪些证书?

IT信息化企业,系统集成企业需要做的资质证书有哪些?经常遇到有新成立的系统集成商问智达鑫业小编,该申请哪些企业资质,接下来了小编整理下目前市场上使用频率比较高的一些资质证书,大家可以参考下。 信息系统建设和服务…

A-Level考试常见问题综合解答

关于A Level的Q&A 问:参加A Level的考试与其他考试相比有什么优势吗? 答:A Level考试的门数相较其他国际课程更少,学生有更多的时间花费在每门课上取得更好的GPA和最终成绩。问:就读的学校就直接提供A Level课程&a…

jmeter断言

jmeter断言常用的有响应断言和json断言; 常用的响应断言: 1.字符串:如果响应中包含了指定的字符串,判断为成功,不支持正则表达式;如下图: 2.包括:如果响应中包含了指定的字符串&…

mac清空废纸篓怎么恢复?

众所周知,电脑只要在运行都会产生一些临时文件或者文档,而这些文件会存放在电脑的存储空间里,方便我们后续的使用。当Mac中存储的文件过多时,就会影响到我们的正常使用,只有通过清理电脑文件,来释放更多的存…

【JavaWeb开发-Servlet】拾起海中的漂流瓶超强版

目录 原版: 一、思路: 二、实现: 三、资源分享 四、部署服务器时记得修改文件路径 原版: 【JavaWeb开发-Servlet】拾起海中的漂流瓶增强版_代码骑士的博客-CSDN博客【代码】【JavaWeb开发-Servlet】拾起海中的漂流瓶增强版…

SMART PLC运动超驰功能编程应用(含V2.7版本固件下载)

什么是运动控制超驰功能,运动超驰功能如何开启,请参看下面的导图部分: 下面一步步教大家如何更新CPU固件版本。 S7-200 SMART PLC自定义脉冲控制功能块相关详细组态设置,请参看下面的博客。链接如下: S7-200 SMART PLC自定义脉冲轴控功能块AxisControl_FB(梯形图)_RXX…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:MapView MaptrimView

本文简述如何在Smobiler中使用MapView和MaptrimView。 Mapview MapView 地图插件,可用于显示指定地点地图,显示轨迹等。 Step 1. 新建一个SmobilerForm窗体,再拖入MapView和Button,MapView.Size设置(300,300&#xf…

Spring Batch 批处理入门案例解析

引言 书接上篇 Spring Batch 批处理入门案例 ,上篇带小伙伴们写了一个Spring Batch 入门案例,里面有哪些注意要点呢?本篇一起来分析分析~ 案例解析 整个入门案例核心点有5个,一一来讲解一下 EnableBatchProcessing 批处理启动…

AD8226组成的高精度放大电路之一

工业设备中常常需要用到高速、高精度的模拟前端方案,而其中控制系统中的信号电平通常为以下几类之一:单端电流(4 mA 至 20 mA)、单端差分电压(0 V 至 5V、0 V 至10 V、5 V、10 V)或者来自热电偶或称重传感器等传感器的小信号输入。大共模电压摆幅也非常典型,尤其是小信号…

Spring Cloud Zuul过滤器介绍及使用(传递数据、拦截请求和异常处理)

在教程《Zuul网关的介绍及使用》中一开始就介绍过,Zuul 可以实现很多高级的功能,比如限流、认证等。想要实现这些功能,必须要基于 Zuul 给我们提供的核心组件“过滤器”。下面我们一起来了解一下 Zuul 的过滤器。 过滤器类型 Zuul 中的过滤…

问题来了,拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗?

今天,聊一个有趣的问题:拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗? 可能有的同学会说,网线都被拔掉了,那说明物理层被断开了,那在上层的传输层理应也会断开,所以原…

MarkDown 项目中如何引入开源MarkDown? 史上最简单教程

目录 一、少不了的东西 editor.md ① 下载链接 ② 将其引入到自己的项目中 引入依赖 二、代码部分 一些小细节 1. 编辑页 2. 展示页 一、少不了的东西 如果想要在一个页面中使用MarkDown ,那么你首先就要引入MarkDown editor.md ① 下载链接 GitHub下…

Flutter和Rust如何优雅的交互

前言 文章的图片链接都是在github上,可能需要...你懂得;本文含有大量关键步骤配置图片,强烈建议在合适环境下阅读 Flutter直接调用C层还是蛮有魅力,想想你练习C,然后直接能用flutter在上层展示出效果,是不…

【中级ECharts技术】transform进行数据转换和dataZoom在项目中的使用(可视化非常的强劲)

transform 进行数据转换 数据转换是这样一个公式:outData=f(inputData)。F是转换方法,例如filter、sort、region、boxplot、cluster、aggregate(todo)等。有了数据转换功能,我们至少可以做到以下几点: 将数据分成多个部分,并在不同的饼图中显示它们。 执行一些数据统计…

C++ 注释

📒博客主页: ​​开心档博客主页​​ 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由开心档原创! 📆51CTO首发时间:🌴2022年12月12日🌴 ✉…

Httpd服务进阶知识-HTTP协议详解

一.WEB开发概述 1>.C/S编程 CS即客户端、服务器编程。 客户端、服务端之间需要使用Socket,约定协议、版本(往往使用的协议是TCP或者UDP),指定地址和端口,就可以通信了。客户端、服务端传输数据,数据可以有一定的格式&#xff…

Go开发中配置一个Logger日志的功能实现(结合zap日志库)

为什么需要Logger 一般在开发项目的时候我们都是需要一个存储日志的文件,因为在部署项目以后,我们只能通过去筛查日志进行检索问题,这时候日志是否可以呈现清晰这个对于我们进行排查工作是十分重要的,所以Logger能否展示出我们最…

基于PHP的中华诗歌网的设计与实现

目 录 Abstract 2 目 录 3 1 绪论 5 1.1 研究背景 5 1.2诗歌鉴赏网站的意义 5 1.3网站开发的设计思想 5 2 系统相关技术 7 2.1 MySQL数据库介绍 7 2.2 PHP技术介绍 8 3 系统需求分析 10 3.1 系统需求分析 10 3.2系统可行性分析 10 3.3 系统用例分析 11 4 系统的详细设计 12 4.1…

QT 短时间大量图片传输,实现监控效果 (实时视屏传输) (暴力模式)

1.首先需要知道的知识 1.我使用的是 TCP 协议传输 ,因为传输数据准确一点, 2. 然后是 套接字的 信号 , readyRead( ) ,这个信号的功能是只要套接字里面的 缓存区有数据,他就会发出这个信号。 3.我们传输数据有时候,会出现 粘…

[附源码]计算机毕业设计公共台账管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…