行为型模式--模版方法模式(图文详解)

news2024/11/24 19:37:10

模版方法模式--图文详解

  • 采摘机器人-场景体验
  • 模版方法模式-解决问题
  • 模版方法模式-定义
  • 优缺点
    • 优点
    • 缺点

采摘机器人-场景体验

今天看抖音上外国开始使用采摘苹果的机器人,我们模仿一下的他的大体流程:

  1. 主体采摘车进入苹果园
  2. 进入苹果指定采摘地点(路线)
  3. 采摘无人机起飞
  4. 识别苹果
  5. 识别苹果是否成熟
  6. 采摘并运送至采摘车储物空间
  7. 储物空间满时退出苹果园
  8. 到苹果储存地点卸载苹果

转化成代码:

public static void main(String[] args) {
        String apple = "苹果";
        String appleOrchard = "苹果园";
        String mainBody = "主体采摘车";
        String pickingDrone = "采摘无人机";
        System.out.println("1:"+mainBody+"进入"+appleOrchard+"。");
        System.out.println("2:"+mainBody+"进入"+apple+"指定采摘路径。");
        System.out.println("3:"+pickingDrone+"起飞。");
        System.out.println("4:"+pickingDrone+"通过"+apple+"识别算法,识别"+apple);
        System.out.println("5:"+pickingDrone+"通过"+apple+"成熟度识别算法,识别成熟"+apple);
        System.out.println("6:"+pickingDrone+"采摘成熟"+apple+"并送至"+mainBody+"储物空间。");
        System.out.println("7:"+mainBody+"储物空间满时退出"+appleOrchard+"。");
        System.out.println("8:"+mainBody+"到达"+apple+"储存仓库卸载"+apple);
    }

执行结果:
在这里插入图片描述

  农场主使用了上述机器人之后发现非常不错,所以选择桃子和🍐的采摘也要使用机器人进行。
于是桃子采摘的代码如下:

public static void main(String[] args) {
        String peach = "桃子";
        String peachOrchard = "桃子园";
        String mainBody = "主体采摘车";
        String pickingDrone = "采摘无人机";
        System.out.println("1:"+mainBody+"进入"+peachOrchard+"。");
        System.out.println("2:"+mainBody+"进入"+peach+"指定采摘路径。");
        System.out.println("3:"+pickingDrone+"起飞。");
        System.out.println("4:"+pickingDrone+"通过"+peach+"识别算法,识别"+peach);
        System.out.println("5:"+pickingDrone+"通过"+peach+"成熟度识别算法,识别成熟"+peach);
        System.out.println("6:"+pickingDrone+"采摘成熟"+peach+"并送至"+mainBody+"储物空间。");
        System.out.println("7:"+mainBody+"储物空间满时退出"+peachOrchard+"。");
        System.out.println("8:"+mainBody+"到达"+peach+"储存仓库卸载"+peach);
    }

  此时我们对比苹果和桃子采摘的代码会发现重复了是很高的。他们的处理过程基本相同。世间水果如此多,如果为每一种水果都按照这种方式写一个采摘机器人,那繁琐程度、无聊程度以及出现错误的概率是非常高的。
  归纳一下上面代码的特点:有统一的处理流程,区别只是流程中某些步的具体实现可能不同。

模版方法模式-解决问题

  为了解决上述问题,大佬们总结出了“模版方法模式”,也就是有一个方法它规定了某个事情的处理流程模版(规定某个地方要干什么事,具体怎么干不管),某些步骤的具体处理逻辑由子类去自己实现。

使用模版方法的思想改造我们的代码:
定义一个模版方法:

public abstract class FruitPick {
	//用final修饰防止被子类重写
    public final void pickWork(){
        String mainBody = "主体采摘车";
        String pickingDrone = "采摘无人机";
        System.out.println("1:"+mainBody+"进入"+getOrchardName()+"。");
        System.out.println("2:"+mainBody+"进入"+getFruitName()+"指定采摘路径。");
        System.out.println("3:"+pickingDrone+"起飞。");
        System.out.println("4:"+pickingDrone+"通过"+runIdentify(getFruitName()));
        System.out.println("5:"+pickingDrone+"通过"+runMaturityIdentify(getFruitName()));
        System.out.println("6:"+pickingDrone+"采摘成熟"+getFruitName()+"并送至"+mainBody+"储物空间。");
        System.out.println("7:"+mainBody+"储物空间满时退出"+getOrchardName()+"。");
        System.out.println("8:"+mainBody+"到达"+getFruitName()+"储存仓库卸载"+getFruitName());
    }

    /**
     * 获取水果名称
     * @return
     */
    public abstract String getFruitName();

    /**
     * 获取水果园名称
     * @return
     */
    public abstract String getOrchardName();

    /**
     * 水果识别算法
     * @param fruitName 水果名称
     * @return
     */
    public abstract String runIdentify(String fruitName);

    /**
     * 水果成熟度识别算法
     * @param fruitName 水果名称
     * @return
     */
    public abstract String runMaturityIdentify(String fruitName);

}

模版方法中的苹果采摘类实现:

public class ApplePickMain extends FruitPick{
    public static void main(String[] args) {
        ApplePickMain applePickMain = new ApplePickMain();
        applePickMain.pickWork();
    }
    @Override
    public String getFruitName() {
        return "苹果";
    }

    @Override
    public String getOrchardName() {
        return "苹果园";
    }

    @Override
    public String runIdentify(String fruitName) {
        //一系列苹果识别逻辑
        if ("苹果".equals(fruitName)){
            return "苹果识别算法识别完成,结果:是苹果";
        }
        return "苹果识别算法识别完成,结果:不是苹果";
    }

    @Override
    public String runMaturityIdentify(String fruitName) {
        //一系列苹果成熟度判断逻辑
        return "苹果程度度识别算法识别完成,结果:已成熟。";
    }
}

其他水果采摘类的实现方式同苹果类。
  通过上述优化。重复的代码都被提升到了超类中,每一种水果对应的类只需要去完成自己独特的业务逻辑即可,而且公共的处理流程也被规范化。减少了出现问题的可能性。

模版方法模式-定义

  模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
  简单说,模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式。

上述定义引自:模版方法模式

优缺点

优点

  1. 共同处理逻辑放在了父类,可以提高复用性。
  2. 个性化逻辑由子类自己去实现,提高代码的扩展性。
  3. 去除了子类的重复代码,符合开闭原则。

缺点

  1. 每中事物都要有一个子类实现,增加了类的数量。
  2. 如果父类增加新的抽象方法,所有子类都要修改。
  3. 间接增加了系统复杂性。

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

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

相关文章

通过自动化单元测试的形式守护系统架构

目录 0前言 1 背景 2 为什么选择 Archunit 3 Archunit 是什么 4 引入 Archunit 4.1 开始就是如此简单 4.2 如何组织架构规则 4.3 团队如何规范化 0前言 通过自动化单元测试的形式守护系统架构是一种有效的方式,可以确保系统在不断演进和修改的过程中保持稳…

Python实战之数据挖掘详解

一、Python数据挖掘 1.1 数据挖掘是什么? 数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过算法,找出其中的规律、知识、信息的过程。Python作为一门广泛应用的编程语言,拥有丰富的数据挖掘库&#…

数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病...

全文链接:http://tecdat.cn/?p23061 这个数据集(查看文末了解数据免费获取方式)可以追溯到1988年,由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。"目标 "字段是指病人是否有心脏病。它的数值为整数,0无…

盖子的c++小课堂——第二十讲:动态规划

前言 中间呢其实还有两讲,但是那两讲太easy了,根本难不倒你们,所以,我索性不放了~~那我们今天讲一个比较容易的知识点——动态规划(终于没人给我催更了!哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈…

IOC控制反转--.net framework

IOC控制反转–.net framework 分层架构: 一、传统依赖倒置实现 传统工艺:会有依赖,上端全部展示细节 BaseBll baseBll new BaseBll(); baseBll.DoSomething();依赖于抽象:左边依赖倒置,面向抽象 实现类继承接口&am…

React18和React16合成事件原理(附图)

💡 React18合成事件的处理原理 “绝对不是”给当前元素基于addEventListener做的事件绑定,React中的合成事件,都是基于“事件委托”处理的! 在React17及以后版本,都是委托给#root这个容器(捕获和冒泡都做了…

动态规划入门第1课

1、从计数到选择 ---- 递推与DP(动态规划) 2、从递归到记忆 ---- 子问题与去重复运算 3、动态规划的要点 第1题 网格路1(grid1) 小x住在左下角(0,0)处,小y在右上角(n,n)处。小x需要通过一段网格路才能到小y家。每次,小x可以选…

视频基础知识

1.视频比特率 视频的比特率是指传输过程中单位时间传输的数据量。可以理解为视频的编码采样率。单位是kbps,即每秒千比特。视频比特率是决定视频清晰度的一个重要指标。比特率越高,视频越清晰,但数据量也会越大。比如一部100分钟的电影&#…

5.4 Bootstrap 下拉菜单(Dropdown)插件

文章目录 Bootstrap 下拉菜单(Dropdown)插件用法在导航栏内在标签页内 选项方法 Bootstrap 下拉菜单(Dropdown)插件 Bootstrap 下拉菜单 这一章讲解了下拉菜单,但是没有涉及到交互部分,本章将具体讲解下拉菜…

(链表) 剑指 Offer 58 - I. 翻转单词顺序 ——【Leetcode每日一题】

❓剑指 Offer 06. 从尾到头打印链表 难度&#xff1a;简单 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,3,2] 输出&#xff1a;[2,3,1] 限制&#xff1a; 0 < 链…

自己实现数据结构,有更好的可操作性

https://leetcode.cn/problems/asteroid-collision/ 就是说&#xff0c;非得用人家写的栈不可么 stl 的 stack&#xff0c;没办法随机访问&#xff0c;用 vector 或者再不济数组&#xff0c;就好了&#xff0c;非要用 stl 的&#xff0c;就导致还得有另一个 vector 维护向左走…

多目标灰狼算法(MOGWO)的Matlab代码详细注释及难点解释(佳点集改进初始种群的MOGWO)

目录 一、外部种群Archive机制 二、领导者选择机制 三、多目标灰狼算法运行步骤 四、MOGWO的Matlab部分代码详细注释 五、MOGWO算法难点解释 5.1 网格与膨胀因子 5.2 轮盘赌方法选择每个超立方体概率 为了将灰狼算法应用于多目标优化问题,在灰狼算法中引入外部种群Archi…

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)

目录 1. 返回静态页面 2. 返回非静态页面 2.1 ResponseBody 返回页面内容 2.2 RestController ResponseBody Controller 2.3 示例:实现简单计算的功能 3. 返回JSON对象 3.1 实现登录功能&#xff0c;返回 JSON 对象 4. 请求转发(forward)或请求重定向(redirect) 4.1 请…

Day 63 : 集成学习之 AdaBoosting (1. 带权数据集)

63.1 AdaBoosting基本算法&#xff1a;先从初始训练集训练一个弱学习器&#xff0c;在根据弱学习器的表现对训练样本进行权重调整&#xff0c;经过若干轮之后&#xff0c;将得到一组分类器&#xff0c;将数据输入这组分类器后会得到一个综合且准确的的分类结果。“三个臭皮匠&a…

评论管理功能

后端 bp.get("/comment/list") def comment_list():comments CommentModel.query.order_by(CommentModel.create_time.desc()).all()comment_list []for comment in comments:comment_dict comment.to_dict()comment_list.append(comment_dict)return restful.ok…

Python模块requests基本用法

简介 Python 的 requests 模块是一个流行的第三方库&#xff0c;用于发送HTTP请求。它提供了一组简洁且易于使用的API&#xff0c;使得在Python中进行网络通信变得更加简单和灵活。 目录 1. 基本概念 1.1. HTTP 协议 1.2. GET 请求 1.3. POST 请求 1.4. get 和 post 的区别…

uniapp 小程序 评分组件

效果图&#xff1a; 1、组件&#xff1a;starsRating.vue <template><view class"stars"><image click"btnStars1" class"starsicon" :src"starsObject[0]" mode"widthFix"></image><image c…

Stream API将对象中的某一字段取出转换为list或数组

List<DevicePartMaintain> devicePartMaintainList devicePartMaintainMapper.selectDevicePartMaintainByMitId(mitId);所有id转换为List 要使用Stream流获取devicePartMaintainList中所有的id&#xff0c;您可以使用stream()方法将列表转换为流&#xff0c;然后使用…

从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现

目录 1. 红黑树的引入和简介 2. 红黑树的性质和定义 3. 红黑树的插入 3.1 调整情况一 3.2 调整情况二 3.2.1 调整情况二中的单旋变色 3.2.2 调整情况二中的双旋变色 3.3 调整情况三 3.4 红黑树插入完整代码 4. 红黑树的验证和完整代码 4.1 验证是不是搜索树&#xf…

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址&#xff1a;torch.nn — PyTorch 2.0 documentation 常用的&#xff1a;Sigmoid、ReLU、LeakyReLU等。 作用&#xff1a;为模型引入非线性特征&#xff0c;这样才能在训练过程中…