当前位置: 首页 > news >正文

模 板 方 法 模 式

想必各位常常会遇到这样的问题,在编写继承关系时,有些方法的逻辑所有子类都是一样的,我只希望子类在某些逻辑上不同,最后达到想要的效果……

其实要让我们照着这个目的去写的话,甚至不用刻意学习,我们写出来的也就和模板方法模式(行为型)大差不差。

介绍

其实就像我隔壁那篇对比接口与抽象基类时那个敌人类一样,我们会根据需要将父类中希望子类实现的和希望使用默认实现的给区分开。

正如同这里我希望子类可以选择重写NoMoreShotsNeed来判断是否被攻击,因为我们有的敌人可能拥有不被选中的天选体制!而扣除血量的方法我选择只能通过默认方法实现,因为这个关系核心机制的方法不可以随便改动。当然也可以使用abstract关键字来指定必须由子类实现的方法,实现特性统一。

模板方法的思路就是这样,划分出固定的和可变的行为,再让子类自由发挥。但模板方法中,有一个核心概念——“算法骨架”。它通过组合父类中定义的可变或不可变的方法形成算法,而这个算法则是子类重写的真正目标。

总的来说,其优点也是其目标就是,封装不变部分,扩展可变部分,减少代码重复,从而便于维护。

实现

实现模板方法模式可能会需要以下角色。

1、抽象父类:包含一个“算法骨架”,该骨架定义一组有序的方法调用关系,其实就是包含我们需要的步骤的算法,条件语句循环语句都可以存在。

2、具体子类:继承抽象父类,实现抽象方法。一般来说父类中一定会有一个必须子类实现的抽象方法,这是子类间不同特性的关键。

3、钩子方法:可选。其实就是拥有默认实现的可重写方法,提高灵活性。

好的,光说不练假把式。这里就以在大世界中自在生活的史莱姆为例,用C++实现这个模式!背景是世界中有许许多多的史莱姆,有冰史莱姆,早晨起来就去湖面上玩,火史莱姆,起来后就去岩浆上面玩,风史莱姆,起来就去云朵上玩。这里他们的活动地点各不相同。

正常史莱姆都是跳着前去,就风史莱姆特殊,它必须飞着去。然后他们晚饭都吃的是天地灵气和日月精华,然后吃完就去睡觉。

好了现在该实现《史莱姆的一天》了!

以下为全部代码的实现。

这段代码中,分离了可变步骤和不可变步骤,同时包含了钩子方法,成功实现了模板方法模式。现在看一下输出吧!

小结

这就是模板方法模式了,平常用到的应该很多。

如有补充纠正欢迎留言,我们下次再见~

参考列表:

菜鸟教程-设计模式:www.runoob.com 

http://www.dtcms.com/a/318398.html

相关文章:

  • 人大金仓数据库逻辑备份与恢复命令
  • PostgreSQL报错“maximum number of prepared transactions reached”原因及高效解决方案解析
  • 百货零售行业数字化蓝图整体规划方案(165页PPT)满分可编辑PPT
  • 构建语义搜索引擎:Weaviate的实践与探索
  • XXL-JOB快速入门
  • cygwin+php教程(swoole扩展+redis扩展)
  • 【完整源码+数据集+部署教程】爬行动物异常检测系统源码和数据集:改进yolo11-GhostDynamicConv
  • 一个php 连sqlserver 目标计算机积极拒绝,无法连接问题的解决
  • 第三节 YOLOv5数据集构成
  • 集成显卡 vs 独立显卡:如何通过设备管理器识别你的GPU?
  • Docker 常用命令介绍
  • 【docker】完整 Dockerfile 示例和构建运行指南
  • 飞浆 paddleocr 识别图片上文字的角度
  • 学习 Android(十四)NDK基础
  • OpenWebUI通过pipeline对接dify的workflow
  • 滑动窗口相关题目
  • VirtualBox 搭建 Linux 虚拟机全流程:Nginx 学习环境前置配置指南
  • ##Anolis OS 8.10 安装oracle19c
  • 广州汽车配件3d打印模型加工厂家-中科米堆CASAIM
  • 【计组】存储系统
  • 3479. 水果成篮 III
  • Tiny-cuda-nn安装指南
  • CVE-2021-1879
  • Linux系统编程——环境变量、命令行参数
  • Dart语言语法与技术重点
  • 数据结构—队列和栈
  • openGauss单实例安装
  • YOLOv11改进:集成FocusedLinearAttention与C2PSA注意力机制实现性能提升
  • Redis使用的常见问题及初步认识
  • PLC学习之路-数据类型与地址表示-(二)