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

Unity实现设计模式——模板方法模式

Unity实现设计模式——模板方法模式

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

在这里插入图片描述
注意模板方法模式和策略模式的区别
模板模式注意强调了抽象类公开定义了一个执行的模板方法,而策略模式是对单个算法的封装更具有独立性

下面使用两个例子去介绍模板方法模式:

1.第一个例子(使用比较抽象的例子)

(一)AbstractClass

abstract class AbstractClass
{public abstract void PrimitiveOperation1();public abstract void PrimitiveOperation2();// The "Template method"public void TemplateMethod(){PrimitiveOperation1();PrimitiveOperation2();Debug.Log("");}
}

(二)ConcreteClassA

class ConcreteClassA : AbstractClass
{public override void PrimitiveOperation1(){Debug.Log("ConcreteClassA.PrimitiveOperation1()");}public override void PrimitiveOperation2(){Debug.Log("ConcreteClassA.PrimitiveOperation2()");}
}

(三)ConcreteClassB

class ConcreteClassB : AbstractClass
{public override void PrimitiveOperation1(){Debug.Log("ConcreteClassB.PrimitiveOperation1()");}public override void PrimitiveOperation2(){Debug.Log("ConcreteClassB.PrimitiveOperation2()");}
}

(四)测试

public class TemplateMethodStructure : MonoBehaviour
{void Start ( ){AbstractClass aA = new ConcreteClassA();aA.TemplateMethod();AbstractClass aB = new ConcreteClassB();aB.TemplateMethod();}
}

2.第二个例子(使用一个三明治的制作过程来介绍)

(一)Hoagie 三明治抽象基类

    public abstract class Hoagie{public void MakeSandwich(){Debug.Log("Making new Sandwich");CutBun();if (CustomerWantsMeat()){AddMeat();}if (CustomerWantsCheese()){AddCheese();}if (CustomerWantsVegetables()){AddVegetables();}if (CustomerWantsCondiments()){AddCondiments();}WrapTheHoagie();}protected abstract void AddMeat();protected abstract void AddCheese();protected abstract void AddVegetables();protected abstract void AddCondiments();protected virtual bool CustomerWantsMeat() { return true; } // << called Hookprotected virtual bool CustomerWantsCheese() { return true; }protected virtual bool CustomerWantsVegetables() { return true; }protected virtual bool CustomerWantsCondiments() { return true; }protected void CutBun(){Debug.Log("Bun is Cut");}protected void WrapTheHoagie(){Debug.Log("Hoagie is wrapped.");}}

(二)ItalienHoagie 法式三明治

    public class ItalienHoagie : Hoagie{protected override void AddMeat(){Debug.Log("Adding the Meat: Salami");}protected override void AddCheese(){Debug.Log("Adding the Cheese: Provolone");}protected override void AddVegetables(){Debug.Log("Adding the Vegetables: Tomatoes");}protected override void AddCondiments(){Debug.Log("Adding the Condiments: Vinegar");}}

(三)VeggieHoagie 素菜三明治

    public class VeggieHoagie : Hoagie{protected override void AddMeat(){}protected override void AddCheese(){}protected override void AddVegetables(){Debug.Log("Adding the Vegetables: Tomatoes");}protected override void AddCondiments(){Debug.Log("Adding the Condiments: Vinegar");}protected override bool CustomerWantsMeat() { return false; }protected override bool CustomerWantsCheese() { return false; }}

(四)错误的方式

namespace BadExample{// this way you would have to rewrite a lot of code// especially if something changes or another class differs and does e.g. not AddMeat()public class ItalienHoagie{public void MakeSandwich(){CutBun();AddMeat();AddCheese();AddVegtables();AddCondiments();WrapHoagie();}public void CutBun(){Debug.Log("Hoagie is Cut");}public void AddMeat(){Debug.Log("Added Meat");}public void AddCheese(){Debug.Log("Added Cheese");}public void AddVegtables(){Debug.Log("Added Vegies");}public void AddCondiments(){Debug.Log("Added Condiments");}public void WrapHoagie(){Debug.Log("Wrapped Hoagie");}}}

(五)测试

    public class TemplateMethodPatternExample1 : MonoBehaviour{void Start(){Hoagie cust12Hoagie = new ItalienHoagie();cust12Hoagie.MakeSandwich();Hoagie cust13Hoagie = new VeggieHoagie();cust13Hoagie.MakeSandwich();}}

相关文章:

Unity实现设计模式——模板方法模式

Unity实现设计模式——模板方法模式 模板模式(Template Pattern)&#xff0c; 指在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 简单说&#xff0c; 模板方法模式定义一个操作中的算法的骨架&…...

C++实现高性能内存池(二)

文章目录 一、设计内存池二、实现MemoryPool::construct() 实现MemoryPool::deallocate() 实现MemoryPool::~MemoryPool() 实现MemoryPool::allocate() 实现三、与 std::vector 的性能对比一、设计内存池 在上节中,我们在模板链表栈中使用了默认构造器来管理栈操作中的元素内…...

沪深300期权一个点多少钱?

经中国证监会批准&#xff0c;深圳证券交易所于2019年12月23日上市嘉实沪深300ETF期权合约品种。该产品是以沪深300为标的物的嘉实沪深300ETF交易型指数基金为标的衍生的标准化合约&#xff0c;下文介绍沪深300期权一个点多少钱?本文来自&#xff1a;期权酱 一、沪深300期权涨…...

怎么防止重要文件夹丢失?文件夹安全如何保护?

我们在使用电脑的过程中&#xff0c;会将重要数据放在文件夹中&#xff0c;那么&#xff0c;我们该怎么防止重要文件夹丢失呢&#xff1f;下面我们就一起来了解一下。 EFS加密 EFS加密可以对于NTFS卷上的文件夹进行加密&#xff0c;加密后的文件夹将只允许加密时登录系统的用户…...

用于物体识别和跟踪的下游任务自监督学习-1-引言

一&#xff1a;引言&#xff1a; 图像和视频理解是计算机视觉应用中的基本问题&#xff0c;旨在使机器能够像人类一样解释和理解视觉数据。这些问题涉及识别图像和视频中的对象、人物、动作、事件和场景。如图1.1-&#xff08;a&#xff09;所示的图像识别任务包括对象检测[1]…...

式子表达ds类——多用位置/值域表示未知数+区间覆盖转区间加:CF407E

https://www.luogu.com.cn/problem/CF407E 多用位置/值域表示未知数 推出的式子中 n n n 表示长度&#xff0c;应该直接换成 r − l 1 r-l1 r−l1 区间覆盖转区间加 推出的式子有 m x , m n mx,mn mx,mn&#xff0c;朴素思路是用单调队列区间覆盖维护 那样就不能很方便…...

Python 实现秒表功能(比较好玩的题目)

以下实例使用 time 模块来实现秒表功能&#xff1a; import time print(按下回车开始计时&#xff0c;按下ctrlc停止计时) while True:input("")starttimetime.time()print(开始)try:while True:print(计时&#xff1a;,round(time.time()-starttime,0),秒)time.sle…...

DALL-E 3调参教程;百度新出的AI写小说神器;通义听悟看播客也太爽了;系列博文带你理解生成式AI | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 2023年诺贝尔奖全部揭晓&#xff0c;一文看完6类奖项花落谁家 https://www.nobelprize.org/prizes 随着最后一项「经济学奖」的揭秘&a…...

设计模式-享元模式

概念 共享内存&#xff08;主要考虑内存&#xff0c;而非效率&#xff09;相同的数据&#xff0c;共享使用&#xff08;JS中未找到经典应用场景&#xff09; 演示 <!-- 无限下拉列表&#xff0c;将事件代理到高层节点上 --> <!-- 如果都绑定到<a>标签&#x…...

中秋时节赏明月,五子棋戏月饼趣 — Flutter中秋限定版五子棋

前言 当中秋时节来临&#xff0c;我们都期待着与亲人朋友共度这个美好的节日。这个时候&#xff0c;除了传统的赏月和品尝美味的月饼&#xff0c;我还有一个特别的建议——尝试一款有趣的Flutter五子棋游戏&#xff01;这款五子棋游戏以中秋为主题&#xff0c;游戏的棋子也可爱…...

Scala第十九章节

Scala第十九章节 scala总目录 文档资料下载 章节目标 了解Actor的相关概述掌握Actor发送和接收消息掌握WordCount案例 1. Actor介绍 Scala中的Actor并发编程模型可以用来开发比Java线程效率更高的并发程序。我们学习Scala Actor的目的主要是为后续学习Akka做准备。 1.1 Ja…...

kafka与hbase的区别

Kafka 和 HBase 是两个不同的分布式数据存储系统&#xff0c;它们可以在大数据应用中发挥不同的作用。 Kafka 是一个高吞吐量的分布式发布订阅消息系统&#xff0c;主要用于处理实时数据流。它具有以下特点&#xff1a; 高性能&#xff1a;Kafka 能够以非常高的吞吐量和低延迟…...

出栈序列的合法性

给定一个最大容量为 M 的堆栈&#xff0c;将 N 个数字按 1, 2, 3, ..., N 的顺序入栈&#xff0c;允许按任何顺序出栈&#xff0c;则哪些数字序列是不可能得到的&#xff1f;例如给定 M5、N7&#xff0c;则我们有可能得到{ 1, 2, 3, 4, 5, 6, 7 }&#xff0c;但不可能得到{ 3, …...

unity操作_刚体 c#

刚体Rigidbody 首先在场景中创建一个Plane 位置重置一下 再创建一个Cube 充值 y0.5 我们可以看出创建的Cube 和 Plane都自带碰撞器 Plane用的是网格碰撞器 我们可以通过网格世界看到不同的网格碰撞器 发生碰撞&#xff08;条件&#xff09;&#xff1a; 两个物体都有碰撞器 …...

网络编程中套接字(socket)介绍(Python示例)

网络编程中套接字&#xff08;socket&#xff09;介绍&#xff08;Python示例&#xff09; 网络编程就是同一计算机的进程间或者不同的联网计算机之间的通信&#xff08;交换数据&#xff09;。 那么&#xff0c;这两台计算机之间用什么传输数据呢&#xff1f;首先你肯定先需要…...

d3dcompiler_43.dll是什么文件?缺失d3dcompiler_43.dll文件修复与解决方法

今天我要和大家分享的是关于d3dcompiler_43.dll丢失的解决方法。我相信很多网友在使用电脑时都遇到过这个问题&#xff0c;那么接下来就让我们一起来探讨一下如何解决这个问题吧&#xff01; 首先&#xff0c;让我们来了解一下d3dcompiler_43.dll文件的总体介绍。d3dcompiler_…...

YOLOv7改进:SPD-Conv,低分辨率图像和小物体涨点明显,涨点神器!!!

💡💡💡本文属于原创独家改进:SPD-Conv,优势:处理低分辨率图像和小物体等更困难的任务时性能更优 SPD-Conv | 亲测在多个数据集实现暴力涨点,尤其是小物体检测你值得拥有,强烈推荐,独家首发; 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨…...

iris(golang)连接mysql数据库

连接mysql数据库 安装依赖 go get github.com/go-sql-driver/mysqlfunc LinkMySQL(){DB,_ : sql.Open("mysql","root:123456tcp(127.0.0.1:3306)/webgo_accout")//设置数据库最大连接数DB.SetConnMaxLifetime(100)//设置上数据库最大闲置连接数DB.SetMaxId…...

C现代方法(第1、2章)笔记

文章目录 C现代方法笔记&#xff08;chapter1&2&#xff09;序言0.1 C标准0.2 现代方法 第1章 C语言概述1.1 C语言的历史1.1.1 起源1.1.2 标准化1.1.3 基于C的语言 1.2 C语言的优缺点1.2.1 C语言的优点1.2.2 C语言的缺点1.2.3 高效地使用C语言 第2章 C语言基本概念2.1 编写…...

练[CISCN2019 华东南赛区]Double Secret

[CISCN2019 华东南赛区]Double Secret 文章目录 [CISCN2019 华东南赛区]Double Secret掌握知识解题思路关键paylaod 掌握知识 ​ flask框架报错源码泄露&#xff0c;使用脚本进行RC4加解&#xff0c;ssti使用内置函数进行模板注入 解题思路 打开网站链接&#xff0c;页面就一…...

Maxwell 2D仿真进阶:从磁力线可视化到磁感应强度曲线分析

1. Maxwell 2D仿真基础与优势解析 第一次接触电磁场仿真时&#xff0c;我被各种专业术语和复杂的操作界面搞得晕头转向。直到发现Maxwell 2D这个神器&#xff0c;才真正体会到电磁仿真的魅力。相比于3D仿真&#xff0c;2D版本有个特别实用的功能——可以直接观察磁力线分布&…...

ncmdump终极指南:3步快速解锁网易云音乐NCM加密文件的完整免费解决方案

ncmdump终极指南&#xff1a;3步快速解锁网易云音乐NCM加密文件的完整免费解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的歌曲只能在特定客户端播放而烦恼吗&#xff1f;ncmdump这款强大的NCM解密工…...

Docker 部署 SpringBoot 项目超详细教程

Docker 部署 SpringBoot 项目超详细教程一篇适合新手的 Docker 部署 SpringBoot 实战教程&#xff0c;包含&#xff1a; Docker 安装镜像加速SpringBoot 打包Dockerfile 编写构建镜像容器部署日志查看防火墙开放常见问题解决 图文并茂&#xff0c;保姆级教学。本文假设你已拥有…...

Arm Neoverse CMN-650错误处理与事务管理机制解析

1. Arm Neoverse CMN-650错误处理机制深度解析在现代多核处理器系统中&#xff0c;错误处理机制的设计直接影响着系统的可靠性和稳定性。Arm Neoverse CMN-650作为一款高性能一致性网状网络&#xff0c;其错误处理架构展现了精妙的设计理念。1.1 HN-I节点的错误分类与处理HN-I&…...

LaTeX-PPT:如何在3分钟内将专业数学公式融入PowerPoint演示

LaTeX-PPT&#xff1a;如何在3分钟内将专业数学公式融入PowerPoint演示 【免费下载链接】latex-ppt Use LaTeX in PowerPoint 项目地址: https://gitcode.com/gh_mirrors/la/latex-ppt 还在为PowerPoint中编辑复杂数学公式而头疼吗&#xff1f;LaTeX-PPT这款开源插件彻底…...

微软 Qlib 实战:从零构建跑赢大盘的 AI 智能选股策略(附最新回测与全流程代码)

在 GitHub 的量化投资社区中&#xff0c;微软亚洲研究院开源的 Qlib 毫无疑问是王者级别的存在&#xff08;13k Stars&#xff09;。传统的量化策略通常依赖主观经验设定的指标&#xff08;如&#xff1a;均线突破、MACD背离&#xff09;&#xff0c;而 Qlib 则是让 人工智能&a…...

Vercel反向代理实战:基于Serverless Functions构建安全API网关

1. 项目概述&#xff1a;一个反向代理的轻量级解决方案最近在折腾个人项目部署时&#xff0c;遇到了一个挺典型的问题&#xff1a;前端应用托管在 Vercel 上&#xff0c;但需要安全地调用一些部署在其他地方&#xff08;比如家里的 NAS&#xff0c;或者某个有严格 IP 白名单限制…...

开源、有文档、能上线的 .NET + Vue 通用权限系统

前言在日常项目开发中&#xff0c;权限管理几乎是每个系统都绕不开的基础模块。从用户登录、菜单控制到数据隔离&#xff0c;一套稳定、灵活、可扩展的权限体系&#xff0c;往往决定了整个项目的成败。然而&#xff0c;从零开始搭建这样的平台&#xff0c;不仅耗时耗力&#xf…...

高性能缓冲管理中的数组翻译技术解析

1. 高性能缓冲管理中的数组翻译技术解析在现代数据库系统中&#xff0c;缓冲管理器是连接内存与持久化存储的关键组件&#xff0c;其核心任务是将逻辑页ID映射到物理内存帧。传统方案如哈希表或指针交换存在三个根本性缺陷&#xff1a;内存开销随数据集线性增长、并行访问时的锁…...

嵌入式飞行控制实战:从传感器融合到PID调参的无人机飞控开发指南

1. 项目概述与核心价值最近在嵌入式开发圈子里&#xff0c;一个名为trsdn/nanopielot的项目引起了我的注意。乍一看这个名字&#xff0c;它像是一个针对特定硬件平台&#xff08;比如树莓派 Pico 或类似的 RP2040 微控制器&#xff09;的飞行控制项目。nanopi可能指代 NanoPi 系…...