常见的行为型设计模式

设计模式(三)

常见的行为型模式

1.模板方法模式: 模版模式定义了一个操作的整体流程, 子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤.

假设我们有一个制作饮料的算法框架,这个算法包括以下步骤:

  1. 烧水
  2. 泡制饮料(如泡茶或冲咖啡)
  3. 倒入杯中
  4. 添加调料

制作咖啡 和 茶.

#include <iostream>using namespace std;// 模板方法模式
class TemplatePattern {
public:// 烧水virtual void HeatWater() = 0;// 冲泡virtual void Brew() = 0;// 倒入杯中virtual void PutCup() = 0;// 加料virtual void AddFeed() = 0;void make() {HeatWater();Brew();PutCup();AddFeed();}virtual ~TemplatePattern() { }
};class DrinkTea :public TemplatePattern {
public:DrinkTea( ){  }virtual ~DrinkTea() {  }// 烧水virtual void HeatWater() {cout << "烧矿泉水" << endl;}// 冲泡virtual void Brew() {cout << "冲泡茶" << endl;}// 倒入杯中virtual void PutCup() {cout << "将茶倒入杯中" << endl;}// 加料virtual void AddFeed() {cout << "加入柠檬" << endl;}
};int main() {DrinkTea* tea = new DrinkTea;tea->make();return 0;
}

2.策略模式:定义了一系列算法 ,将每一个算法都封装,并且这些算法之间可以相互替代.

具体实现

#include <iostream>using namespace std;// 武器策略
class WeaponStrategy {
public:virtual void UseWeapon() = 0;virtual ~WeaponStrategy( ) { }
};// 具体的武器(小刀)
class Kinfe :public WeaponStrategy {
public:virtual void UseWeapon() {cout << "user kinfe" << endl;}
};// 具体的武器(ak47)
class AK47 :public WeaponStrategy {
public:virtual void UseWeapon() {cout << "user ak47" << endl;}
};// 小人
class Character {
public:Character( ) {mWeapon_ = nullptr;}// 设置武器void SetWeapon( WeaponStrategy* mWeapon ) {mWeapon_ = mWeapon;}// 使用武器void Use_of_weapons( ) {mWeapon_->UseWeapon();}
private:WeaponStrategy* mWeapon_ ;
};void test1() {Character* character = new Character;WeaponStrategy* kinfe = new Kinfe;WeaponStrategy* ak47 = new AK47;character->SetWeapon(kinfe);// 小人使用武器character->Use_of_weapons();character->SetWeapon(ak47);// 小人使用武器character->Use_of_weapons();
}int main() {test1();return 0;
}

3.观察者模式: 描述对象之间的依赖关系 , 一个对象的状态发生改变 ,会自动通知其他对象,使其他的对象做出反应.

我们可以想象红绿灯的场景 ,当红灯时( 相当于是红绿灯发出的一个信号 ),汽车需要停下等待 .当出现绿灯时,汽车可以正常行驶了.

在这个场景中 , 红绿灯是观察目标 ,汽车是观察者.

具体代码实现:

1.三个英雄打一个BOSS, 处于攻击状态

2.当BOSS死亡使 , 停止攻击( 这里我们假设BOSS不还手 )

#include <iostream>
#include <list>using namespace std;class AbstractorBoss;
// 英雄状态
enum class State  {// 攻击状态ATTACT_ATATE ,// 停止攻击状态STOP_ATTACK_SATATE
};// 英雄抽象类
class AbstractorHero {
public:virtual void Update() = 0;virtual void AttackBoss() = 0;virtual void ShowState() = 0;virtual ~AbstractorHero() { }
protected:int attack_;      // 英雄的攻击力AbstractorBoss *boss_;  //State state_;    // 英雄状态
};class AbstractorBoss {
public:virtual void AddHero( AbstractorHero* hero ) = 0 ;virtual void DeleteHero(AbstractorHero* hero ) = 0 ;virtual void Notify( ) = 0 ;virtual ~AbstractorBoss() { } 
public:list<AbstractorHero*>heros_;    // 英雄列表int blood_;      // 血量
};// 具体的boss
class Boss :public AbstractorBoss {
public:Boss(int blood) {blood_ = blood;}virtual void AddHero(AbstractorHero* hero) {// it -> list<AbstractorHero*>::itreatorfor (auto it : heros_) {   // 在增加英雄的时候,判断英雄是否已经存在if (it == hero) {return;}}heros_.push_back(hero);}virtual void DeleteHero(AbstractorHero* hero) {for (auto it : heros_) {   // 在删除英雄的时候,判断英雄是否已经存在if (it == hero) {heros_.remove(hero);}}}virtual void Notify() {if (blood_ <= 1) {cout << "boss 死亡,英雄停止攻击" << endl;for (auto it : heros_) {it->Update();}}}
};// 英雄A
class HeroA :public AbstractorHero {
public:HeroA(int attack , AbstractorBoss* boss) : AbstractorHero( ){this->attack_ = attack;boss_ = boss;state_ = State::ATTACT_ATATE;}virtual void Update() {state_ = State::STOP_ATTACK_SATATE;}virtual void AttackBoss() {boss_->blood_ -= attack_;}virtual void ShowState() {if (state_ == State::ATTACT_ATATE) {cout << "英雄处于攻击状态" << endl;}else if (state_ == State::STOP_ATTACK_SATATE) {cout << "英雄处于停止攻击状态" << endl;}}
};void test2() {// 创建一个bossAbstractorBoss* boss = new Boss(100);// 创建两个英雄AbstractorHero *hero1 = new HeroA( 50, boss );AbstractorHero* hero2 = new HeroA( 60, boss );boss->AddHero(hero1);boss->AddHero(hero2);hero1->AttackBoss();hero2->AttackBoss();boss->Notify();// 输出英雄的状态hero1->ShowState();hero2->ShowState();
}int main() {//HeroA A(100);test2();return 0;
}

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

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

相关文章

react+customize-cra使用less+less-loader时,可能遇到的问题及解决办法

目录 1、先附上各依赖版本和config-overrides.js配置代码&#xff0c;按这个版本和配置就没问题 2、问题&#xff08;注意&#xff1a;问题顺序没有先后之分哦&#xff09; 2.1、TypeError: Cannot read property tap of undefined 2.2、No module factory available for d…

资金常见业务

资金业务在银行运营中扮演着举足轻重的角色&#xff0c;不仅是重要的资金运用渠道&#xff0c;也是银行资金来源的重要一环。除了通过贷款获取收益外&#xff0c;银行还通过多元化的资金业务实现资金的增值。 资金业务按其性质可以分为多个类别&#xff0c;包括长短期资金业务、…

阐述Python:except的用法和作用?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

网络配置(IP、NETMASK、GATEWAY、DNS、DHCP) <持续更新中>

参考&#xff1a; 初学Linux之网络配置(IP、NETMASK、GATEWAY、DNS、DHCP)-CSDN博客【学习笔记】网关 & 路由_网关和路由-CSDN博客【学习笔记】计算机网络 IP地址与MAC地址_根据mac分配ip-CSDN博客【学习笔记】TCP 和 UDP 协议_tcp 发送 syn 应答没有syn ack-CSDN博客 一…

一次进程虚拟内存占用超过200G问题分析

在对智驾软件系统资源进行分析时&#xff0c;发现一个进程虚存占用过高&#xff0c;超过200G top查看内存占用 有一个node应用占用了200G的虚拟内存 pmap查看该进程内存情况 pmap -x -p 8496结果显示有两个异常点&#xff0c;刚好和虚存使用总量吻合 一个50G和一个170G的堆…

Linux: network: 丢包分析的另一个途径 tracing

丢包的另一个思路&#xff0c;内核里有些counter的计数&#xff0c;记录的不准确。这个时候怎么办&#xff1f;就需要使用另外一个方式&#xff1a;/sys/kernel/debug/tracing/event/skb/kfree_skb 的跟踪功能。这个算是对counter的一个补充&#xff0c;可以拿来做统计分析使用…

udp Socket组播 服务器

什么是组播 组播也可以称之为多播这也是 UDP 的特性之一。组播是主机间一对多的通讯模式&#xff0c;是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将一份报文发送到特定的组播地址&#xff0c;组播地址不同于单播地址&#xff0c;它并不属于特定某个主机…

【云原生】最新版Kubernetes集群基于Containerd部署

Kubernetes集群基于Containerd部署 文章目录 Kubernetes集群基于Containerd部署资源列表基础环境一、基础环境准备1.1、关闭Swap分区1.2、添加hosts解析1.3、桥接的IPv4流量传递给iptables的链 二、准备Containerd容器运行时2.1、安装Containerd2.2、配置Containerd2.3、启动Co…

智慧校园-医务管理系统总体概述

智慧校园医务管理系统&#xff0c;作为校园健康管理体系的智能化升级&#xff0c;深度融合信息技术与医疗服务&#xff0c;为师生构筑起一道全方位的健康守护网。医务管理系统以提升校园医疗服务水平、优化健康管理流程为核心目标&#xff0c;通过一系列创新功能&#xff0c;确…

MYSQL函数进阶详解:案例解析(第19天)

系列文章目录 一、MySQL的函数&#xff08;重点&#xff09; 二、MySQL的窗口函数&#xff08;重点&#xff09; 三、MySQL的视图&#xff08;熟悉&#xff09; 四、MySQL的事务&#xff08;熟悉&#xff09; 文章目录 系列文章目录前言一、MySQL的函数1. 聚合函数2. group_c…

从入口文件搭建php项目

入口文件index.php <?phprequire CallBack.php; // 处理回调请求逻辑 $bot new CallBack();// 请求方式 if (isset($_GET[method])) {$method $_GET[method];if (method_exists($bot, $method)) {return $bot->$method();} else {echo "没有该功能";die();…

Deep Learning复习笔记0

Key Concept: Embedding: learned dense, continuous, low-dimensional representations of object 【将难以表示的对象(如图片&#xff0c;文本等)用连续的低维度的方式表示】 RNN: Recurrent Neural Network -> for processing sequential data (time series data, natur…

【单片机毕业设计选题24035】-基于STM8的便携式智能药盒控制系统

系统功能: 基于STM8的便携式智能药盒控制系统设计的总体方案设计&#xff0c;目前确定的模块主要有&#xff1a; STM8、蓝牙模块、时钟芯片、时钟和复位电路、压力传感器、声光报警电路、按键模块、系统电源模块构成。 STM8&#xff1a;核心控制器&#xff0c;完成各模块的控…

“中国象棋第一人”王天一被查:到底是因作弊还是受贿?

“中国象棋第一人”王天一被查&#xff1a;到底是因作弊还是受贿&#xff1f; 近日&#xff0c;中国象棋界掀起了一场巨大的风波&#xff0c;被誉为“中国象棋第一人”的王天一被查的消息引起了广泛的关注与热议。据悉&#xff0c;王天一因涉嫌非国家工作人员受贿被有关部门依…

npm常用命令详解与实践

npm&#xff08;Node Package Manager&#xff09;是一个JavaScript编程语言的包管理器&#xff0c;它是Node.js的默认包管理工具。npm用于管理项目中的依赖关系&#xff0c;安装、更新和发布包。 以下是一些常用的npm命令及其详解和实践示例&#xff1a; 1. npm init 初始化…

分数限制下,选好专业还是选好学校?过来人跟你说

声明&#xff1a;本文都是实在话&#xff0c;面向普通人&#xff0c;不喜勿喷。 首先呢&#xff0c;尊重你的特长和兴趣&#xff0c;有特别想去的专业或者特别想去的学校当然别犹豫。 不过呢&#xff0c;大部分人没什么特长也没什么特别喜好&#xff0c;咋选呢&#xff1f; 对大…

pc端制作一个顶部固定的菜单栏

效果 hsl颜色 hsl颜色在css中比较方便 https://www.w3school.com.cn/css/css_colors_hsl.asp 色相&#xff08;hue&#xff09;是色轮上从 0 到 360 的度数。0 是红色&#xff0c;120 是绿色&#xff0c;240 是蓝色。饱和度&#xff08;saturation&#xff09;是一个百分比值…

i-Health

技术栈&#xff1a;HTMLCSSJavascriptPHP

使用TranslateAnimation实现动画效果

使用TranslateAnimation实现动画效果 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在本文中&#xff0c;我们将探讨如何使用Android中的TranslateAnimation类…

将CSV、Excel、XML文件转换为MySQL数据库

在平时的工作中&#xff0c;经常会遇到需要将文件数据导入到数据库中的情况。有些客户之前可能只使用Excel表格作为记录工具&#xff0c;但当数据量达到一定程度或者需要将数据导入到其他系统中时&#xff0c;就会很emo,因为Excel表格虽然方便&#xff0c;但在数据处理和管理方…