设计模式学习笔记(七)之模板方法模式(Template Method)

2023-11-12

           设计模式学习笔记(七)之模板方法模式(Template Method)

            最近实习工作稍微没有那么忙了,继续抽些晚上时间学习一下设计模式,以下是看设计模式书的学习笔记,关于模式定义之类的内容是在自己理解之后进行摘录的,希望对大家有用;

     代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4449870


             (一)模板方法定义:

             定义一个操作中的方法的框架,可以把一些具体要做的步骤放入到子类中,可以让子类可以不去改变整个方法的结构,重新去定义并且实现该框架中的算法的步骤;

             

             直接看个例子吧:

【情景】假如你现在是一家汽车设计模型的工厂,拿到一个生产汽车的订单,不考虑其他的汽车要求,只要保证汽车最基本的功能(发动,刹车,鸣笛,开起来),这样一般工厂会了提高效率,降低成本,会先设计一套包含基本功能的模板,具体到某辆汽车的时候,为该汽车实现具体的方法;下面就用汽车的例子,先看下类图:

     

      汽车模型模板抽象类中定义四个基本的模板方法,具体的要生产的汽车类,去实现模板抽象方法,根据需要实际实现其中的方法;看代码;

        汽车模板方法抽象类:

package com.jiangqq.template02;

/**
 * 汽车的模板方法 公共抽象类
 * @author jiangqq
 * @see <a href http://blog.csdn.net/jiangqq781931404>CSDN博客</a>
 */
public abstract class CarModel {
	//汽车发动
    public abstract void start();
    //汽车停止
    public abstract void stop();
    //汽车鸣笛
    public abstract void ring();
    //汽车启动运行
    public abstract void run();
}  
   下面是具体的汽车类的实现:

package com.jiangqq.template02;

/**
 * 根据模板方法建造第一种类型的汽车
 * 
 * @author jiangqq
 * 
 */
public class CarFirst extends CarModel {
	@Override
	public void start() {
		System.out.println("CarFirst开始发动......");
	}

	@Override
	public void stop() {
		System.out.println("CarFirst开始刹车......");
	}

	@Override
	public void ring() {
		System.out.println("CarFirst鸣笛......");
	}

	@Override
	public void run() {
		this.start();
		this.ring();
		this.stop();
	}
}




package com.jiangqq.template02;

/**
 * 根据模板方法建造第一种类型的汽车
 * 
 * @author jiangqq
 * 
 */
public class CarSecond extends CarModel {
	@Override
	public void start() {
		System.out.println("CarSecond开始发动......");
	}

	@Override
	public void stop() {
		System.out.println("CarSecond开始刹车......");

	}

	@Override
	public void ring() {
		System.out.println("CarSecond鸣笛......");
	}

	@Override
	public void run() {
		this.start();
		this.ring();
		this.stop();
	}

}
客户端测试代码:

package com.jiangqq.template02;

public class ClientTest {
public static void main(String[] args) {
 CarFirst carFirst=new CarFirst();
 carFirst.run();
 System.out.println("---------------------");
 CarSecond carSecond=new CarSecond();
 carSecond.run();
}
}



看上面的代码,我们发现每个具体要实现的类中的代码有相同的,而且run()方法都一样的,这样我们可以重新对它进行设计:再汽车模板抽象类中,不要把run()弄成抽象方法,具体看下面的代码

汽车模版抽象类:

package com.jiangqq.template03;

/**
 * 汽车的模板方法 公共抽象类
 * @author jiangqq
 * @see <a href http://blog.csdn.net/jiangqq781931404>CSDN博客</a>
 */
public abstract class CarModel {
	//汽车发动
    public abstract void start();
    //汽车停止
    public abstract void stop();
    //汽车鸣笛
    public abstract void ring();
    //汽车启动运行
    public  void run()
    {
    	this.start();
    	this.ring();
    	this.stop();
    }
}  
具体汽车中的代码和第一种例子的代码相比,少了run()方法,

客户端测试代码如下:

package com.jiangqq.template03;

public class ClientTest {
public static void main(String[] args) {
 CarModel carFirst=new CarFirst();
 carFirst.run();
 System.out.println("---------------------");
 CarModel carSecond=new CarSecond();
 carSecond.run();
}
}


  模板方法的特点(摘录自大话设计模式):

  模板方法模式是通过把不变形为搬移到超类(父类),这样去除了子类中的重复代码,这样也达到了一个代码复用的效果

  

   模板方法的优点:

  • 封装不变部分,扩展可变部分
  • 提取公共部分的代码,便于维护
  • 整个的方法行为让父类去控制,子类负责实现

  

   代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4449870

    




                      

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式学习笔记(七)之模板方法模式(Template Method) 的相关文章

  • Java复习-25-单例设计模式

    单例设计模式 目的 使用场景 在实际开发下 会存在一种情况 某一种类在程序的整个生命周期中 只需要实例化一次就足够了 例如 系统数据类 由于操作系统只有一个 因此在程序初始化时该类只需要实例化一次 之后的系统数据更改都是在这一个实例化对象中
  • c++享元模式

    享元模式 1 享元模式简介 享元模式在 设计模式 可复用面向对象软件的基础 一书中是这样说的 运用共享技术有效地支持大量细粒度的对象 本质就是对大量细粒度的对象进行共享 不是每个对象都要通过new的方式去创建 而是通过区分对象的内部状态和外
  • 设计模式-单一职责原则介绍与理解

    描述 一个类应该专注于实现一个功能 好处 便于代码复用 举例 俄罗斯方块游戏 首先可以想到的是游戏逻辑与界面的分离 也就是说逻辑一个类 界面部分一个类 这样做的好处就是我们可以复用游戏逻辑的代码 例如我们用java写了一个基于PC端的俄罗斯
  • python语法(高阶)-设计模式(单例模式)

    参考内容 黑马程序员
  • 设计模式之(三)---工厂方法模式

    女娲补天的故事大家都听过吧 这个故事是说 女娲在补了天后 下到凡间一看 哇塞 风景太优美了 天空是湛 蓝的 水是清澈的 空气是清新的 太美丽了 然后就待时间长了就有点寂寞了 没有动物 这些看的到 都是静态的东西呀 怎么办 别忘了是神仙呀 没
  • 小谈设计模式(1)—总序

    小谈设计模式 1 总序 专栏地址 开始操作 设计模式总论 设计模式是什么 组成要素 模式名称 问题描述 解决方案 效果描述 设计模式有什么作用 提供可重用的解决方案 提高代码的可读性和可维护性 促进代码的可扩展性 提高代码的灵活性和可重用性
  • 设计模式——简单工厂模式

    简单工厂模式定义为 简单工厂模式又称为静态工厂方法模型 它属于类创建型模式 在简单工厂模式中 可以根据参数的不同返回不同类的实例 简单工厂专门定义一个类来负责创建其他类的实例 被创建的实例通常都具有共同的父类 简单工厂模式结构图 简单工厂模
  • 设计模式一之简单工厂模式

    生活示例 刻板印刷 gt 活字印刷举例 喝酒唱歌 人生真爽 gt 对酒当歌 人生几何 可维护 需要修改 则只需要改需要改的字即可 可复用 字体可在后来的印刷复用 可扩展 需要加字 只需要加入相应的刻字即可 灵活性好 字的排列可能竖排或横排
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线
  • 每日一问:你想如何破坏单例模式?

    前言 1 单例是什么 单例模式 是一种创建型设计模式 目的是保证全局一个类只有一个实例对象 分为懒汉式和饿汉式 所谓懒汉式 类似于懒加载 需要的时候才会触发初始化实例对象 而饿汉式正好相反 项目启动 类加载的时候 就会创建初始化单例对象 1
  • 单例模式的八种写法比较

    单例模式是最常用到的设计模式之一 熟悉设计模式的朋友对单例模式都不会陌生 一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式 但是除了这两种方式 本文还会介绍其他几种实现单例的方式 让我们来一起看看吧 简介 单例模式是一种常
  • 设计模式——State(状态)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 应用举例 4 1 State TcpState 4 2 Context TcpConnection 4 3 ConcreteState ListeningTcp
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • JavaScript设计模式-02-单例模式

    Javascript 设计模式 02 单例模式 简介 单例就是保证一个类只有一个实例 实现的方法一般是先判断实例是否存在 如果存在直接返回 如果不存在就创建了再返回 确保了一个类只有一个实例对象 在JavaScript里 单例作为一个命名空
  • 二十四种设计模式之策略模式

    一 什么是策略模式 简单来说 策略模式是将每一个算法封装到拥有共同接口的不同类中 使得算法可以在不影响客户端的情况下发生变化 也可以理解为可供程序运行时选择的 不同的类 不同的解决方案 策略模式的特点 高内聚低耦合 可扩展 遵循ocp原则
  • Java监听器与观察者模式

    Java监听器与观察者模式 Java中的监听器 Listener 和观察者模式 Observer Pattern 都是用于处理对象间的事件通知和响应的设计模式 它们的目的是在对象之间建立一种松散的耦合 使得一个对象的状态变化可以通知到其他对
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并

随机推荐

  • 【字节面试题】小于n的最大数

    标题 小于n的最大数 题目描述 给定一个数你 入23121 给定一个数组A如 2 4 9 求由A中元素组成的 小于n的最大数 如小于23121的最大数是22999 思路 1 把数组排序 2 把int转换成字节数组 从第一个开始变量 如2 从
  • App6种常见的数据加载设计

    设计师在进行APP设计的设计时 往往会更加专注于界面长什么样 界面和界面之间怎么跳转 给予用户什么样的操作反馈 却偏偏特别容易忽略掉一个比较重要的环节 就是APP数据加载中的设计 所以会导致我们看到的APP 往往有着华丽的启动界面 然后就是
  • Python3, 19行代码,让微信登录页面地球转起来,涨见识了。

    19行代码动态展示微信地图 1 引言 2 代码实战 2 1 思路 2 2 示例 2 2 1 经纬度 2 2 2 制作gif 3 总结 1 引言 小屌丝 鱼哥 最近在干啥嘞 小鱼 干活呗 不然能干啥 小屌丝 嘿嘿 小鱼 你这笑的 怎么 那么
  • FPGA_分频(信号使能分频与计数器分频)(奇偶分频)

    时钟对于 FPGA 是非常重要的 但板载晶振提供的时钟信号频率是固定的 不一定满 足工程需求 所以分频和倍频还是很有必要的 一 计数器分频 这里通过计数的方式来实现分频 1 通过计数器来实现6分频 两种方式 第一种直接通过计数方式直接获取获
  • 华为OD机试 Java 实现【整型数组合并】【牛客练习题】

    一 题目描述 将两个整型数组按照升序合并 并且过滤掉重复数组元素 输出时相邻两数之间没有空格 二 输入描述 输入说明 按下列顺序输入 输入第一个数组的个数 输入第一个数组的数值 输入第二个数组的个数 输入第二个数组的数值 三 输出描述 输出
  • Qt添加第三方字体

    最近开发项目时 据说不能用系统自带的微软雅黑字体 于是找一个开源的字体 思源黑体 这个是google和Adobe公司合力开发的可以免费使用 本篇记录一下Qt使用第三方字体的方式 字体从下载之家下载http www downza cn sof
  • C#文件后缀名详解

    sln 解决方案文件 为解决方案资源管理器提供显示管理文件的图形接口所需的信息 csproj 项目文件 创建应用程序所需的引用 数据连接 文件夹和文件的信息 aspx Web 窗体页由两部分组成 视觉元素 HTML 服务器控件和静态文本 和
  • 什么是P = NP?问题

    文章目录 引言 天才基本法 什么是P NP问题 P NP 成立吗 总结 提示 以下是本篇文章正文内容 Java系列学习将会持续更新 引言 今天我们先放松一下 这篇文章并不是Java课程的学习 而是带大家认识一个学术问题 但是请大家放心 这里
  • libevent多线程使用事项

    在linux平台上使用c开发网络程序的同志们一般情况下都对鼎鼎大名的libevent非常的熟悉了 但是一些新进入此领域的new new people们对此都是一头雾水 原本的迷茫再加上开源软件一贯的 帮助文件 缺失作风 让我们这些新手们显的
  • 免费C/C++编译器

    不好意思 等到现在才想到要写这篇文章 怎么说呢 情况是这样的 刚开始我学习C语言时 是想在机器上安装visual c 的 因为Turbo C太古老了 用起来不方便 所以很自然地想安装vc 不过不知道大家有没有发现vc很大 而且有些机子就是安
  • 线程是什么意思

    线程是操作系统能够进行运算调度的最小单位 它被包含在进程之中 是进程中的实际运作单位 一条线程指的是进程中一个单一顺序的控制流 一个进程中可以并发多个线程 每条线程并行执行不同的任务 在Unix System V及SunOS中也被称为轻量进
  • Structural Time Series modeling in TensorFlow Probability

    在邯郸学步后 想要深入用好Tensorflow中的STS model 还是要静下心来 好好阅读点材料 f t f 1
  • 分页插件pagehelper配置和 使用;

    先看结论 在看代码是实现 代码就这么多 现在来看配置 配置 1 pom xml加入这个依赖 com github pagehelper pagehelper 3 7 5 com github jsqlparser jsqlparser 0
  • 关于HashMap扩容造成死循环的介绍

    一 造成死循环的原因 HashMap扩容导致死循环的主要原因在于扩容后链表中的节点在新的hash桶使用头插法插入 新的hash桶会倒置原hash桶中的单链表 那么在多个线程同时扩容的情况下就可能导致产生一个存在闭环的单链表 从而导致死循环
  • 虚幻4学习笔记(10)蓝图接口、拾取物品-射线检测

    虚幻4学习笔记 蓝图接口 拾取物品 射线检测 骨架网格体和静态网格体的区别 骨架网格体设置碰撞 B站UP谌嘉诚课程 https www bilibili com video BV164411Y732 蓝图接口 添加 内容浏览器 右键 蓝图
  • 多模态简介

    1 多模态定义 多模式深度学习是一个机器学习子领域 旨在训练人工智能模型来处理和发现不同类型数据 模式 之间的关系 通常是图像 视频 音频和文本 通过结合不同的模态 深度学习模型可以更普遍地理解其环境 因为某些线索仅存在于某些模态中 想象一
  • VMware Tools安装(实现物理机与虚拟机文件互拷)

    1 开启虚拟机 2 点击VMware菜单上的虚拟机 弹出的菜单中点击安装VMware Tools 3 点击DVD 出现右边如图 4 复制VMware Tools压缩文件到opt文件夹 复制时可能出现下图描述 5 解决方法 1 打开终端 输入
  • 你了解System.out.println()的真正含义吗?

    在Java编程中 我们常常用 System out println 来输出字符串 也许我们都已经猜到println 是方法名 但System是什么 out又是什么呢 其实System是java lang里面的一个类 如下图 而out就是Sy
  • IDEA中/** 内容 */注释的快捷键

    在 IDEA 中 你可以使用快捷键 来快速生成 内容 注释 要使用此快捷键 请在你想要添加注释的代码行上按 Ctrl Windows 系统 或 Command Mac 系统 如果你想要撤销注释 可以再次按一次快捷键即可 注意 你必须在代码行
  • 设计模式学习笔记(七)之模板方法模式(Template Method)

    设计模式学习笔记 七 之模板方法模式 Template Method 最近实习工作稍微没有那么忙了 继续抽些晚上时间学习一下设计模式 以下是看设计模式书的学习笔记 关于模式定义之类的内容是在自己理解之后进行摘录的 希望对大家有用 代码下载链