【C++设计模式】用动画片《少年骇客》(Ben10)来解释策略模式

2023年8月25日,周五上午

今天上午学习设计模式中的策略模式时,发现这个有点像很多卡通片里面的变身器...

2023年8月26日,周六上午

更新:和简单工厂模式结合


目录

  • 用策略模式写主角的变身器 
  • 使用策略模式的好处
  • 和简单工厂模式结合

用策略模式写主角的变身器 

#include<iostream>//alien hero是外星英雄的意思
//在《少年骇客》中,主角可以通过变身器变成10种外星英雄
class AlienHero{
public://Shapeshift是变身的意思virtual void Shapeshift()=0; 
};//变成超能兽
class Wildmutt:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!超能兽!"<<std::endl;}
};//变成四手霸王
class FourArms:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!四手霸王!"<<std::endl;}
};//变成小奇兵
class GreyMatter:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!小奇兵!"<<std::endl;}
};//变成快闪之星
class Kineceleran:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!快闪之星!"<<std::endl;}
};//主角手上那个手表变身器就叫Omnitrix
class  Omnitrix{AlienHero *ah;
public:Omnitrix(AlienHero *ah){this->ah=ah;}//在手表变身器上选好英雄后,按下手表变身器中间的按钮变身!void push(){ah->Shapeshift();}
};int main(){//变身超能兽!!!Omnitrix omx(new Wildmutt());omx.push();
}


使用策略模式的好处

使用策略模式的好处是,

当我需要添加一种新的外星英雄——Upgrade(变形怪)时,

我不需要改动里面的任何代码,只需要基于抽象类AlienHero再添加一个新类Upgrade就可以了。

#include<iostream>//alien hero是外星英雄的意思
//在《少年骇客》中,主角可以通过变身器变成10种外星英雄
class AlienHero{
public://Shapeshift是变身的意思virtual void Shapeshift()=0; 
};//变成超能兽
class Wildmutt:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!超能兽!"<<std::endl;}
};//变成四手霸王
class FourArms:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!四手霸王!"<<std::endl;}
};//变成小奇兵
class GreyMatter:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!小奇兵!"<<std::endl;}
};//变成快闪之星
class Kineceleran:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!快闪之星!"<<std::endl;}
};
//*******************************
//     新添加的类
//********************************
//变成变形怪
class Upgrade:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!变形怪!"<<std::endl;}
};//主角手上那个手表变身器就叫Omnitrix
class  Omnitrix{AlienHero *ah;
public:Omnitrix(AlienHero *ah){this->ah=ah;}//在手表变身器上选好英雄后,按下手表变身器中间的按钮变身!void push(){ah->Shapeshift();}
};int main(){//变身变形怪!!!Omnitrix omx(new Upgrade());omx.push();
}


和简单工厂模式结合

虽然使用策略模式很方便修改,

但每次变身还要自己手动new一个外星英雄对象,太麻烦了。

能不能直接输入外星英雄名字就变身?

可以结合简单工厂模式,让程序来根据外星英雄名字自动new一个外星英雄对象。

这次我只改动了Omnitrix类

#include<iostream>//alien hero是外星英雄的意思
//在《少年骇客》中,主角可以通过变身器变成10种外星英雄
class AlienHero{
public://Shapeshift是变身的意思virtual void Shapeshift()=0; 
};//变成超能兽
class Wildmutt:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!超能兽!"<<std::endl;}
};//变成四手霸王
class FourArms:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!四手霸王!"<<std::endl;}
};//变成小奇兵
class GreyMatter:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!小奇兵!"<<std::endl;}
};//变成快闪之星
class Kineceleran:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!快闪之星!"<<std::endl;}
};
//*******************************
//     新添加的类
//********************************
//变成变形怪
class Upgrade:public AlienHero{
public:void Shapeshift(){std::cout<<"变身!变形怪!"<<std::endl;}
};//******************
//把简单工厂写在Omnitrix类里面
//******************
//主角手上那个手表变身器就叫Omnitrix
class  Omnitrix{AlienHero *ah;
public:Omnitrix(std::string alienHeroName){//因为C++中的switch不支持std::string,所以我用了if-elseif(alienHeroName=="超能兽")ah=new Wildmutt();else if(alienHeroName=="四手霸王")ah=new FourArms();else if(alienHeroName=="小奇兵")ah=new GreyMatter();else if(alienHeroName=="快闪之星")ah=new Kineceleran();else if(alienHeroName=="变形怪")ah=new Upgrade();else ah=nullptr;}//在手表变身器上选好英雄后,按下手表变身器中间的按钮变身!void push(){ah->Shapeshift();}
};int main(){//变身变形怪!!!Omnitrix omx("变形怪");omx.push();
}

不过,当再次添加一个新的外星英雄时,

Omnitrix类的if-else也要进行更新。

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

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

相关文章

手写实现call() apply() bind()函数,附有详细注释,包含this指向、arguments讲解

手写实现call() apply() bind()函数是很经典的问题&#xff0c;但是能掰扯清楚的文章确实不算多&#xff0c;于是笔者才决定写下本文&#xff0c;希望能给读者带来一些启发&#xff0c;如有错误欢迎指正。 目录 补充知识 函数中的this指向 类数组对象arguments call() 原理…

每日三题 1448统计二叉树中好节点的个数 100相同的树 101对称二叉树

1448 题目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出&#xff…

弯道超车必做好题集锦三(C语言选择题)

前言&#xff1a; 编程想要学的好&#xff0c;刷题少不了&#xff0c;我们不仅要多刷题&#xff0c;还要刷好题&#xff01;为此我开启了一个弯道超车必做好题锦集的系列&#xff0c;每篇大约10题左右。此为第三篇选择题篇&#xff0c;该系列会不定期更新&#xff0c;后续还会…

MongoDB实验——在Java应用程序中操作 MongoDB 数据

在Java应用程序中操作 MongoDB 数据 1. 启动MongoDB Shell 2. 切换到admin数据库&#xff0c;使用root账户 3.开启Eclipse&#xff0c;创建Java Project项目&#xff0c;命名为MongoJava File --> New --> Java Project 4.在MongoJava项目下新建包&#xff0c;包名为mo…

《Go 语言第一课》课程学习笔记(十三)

方法 认识 Go 方法 Go 语言从设计伊始&#xff0c;就不支持经典的面向对象语法元素&#xff0c;比如类、对象、继承&#xff0c;等等&#xff0c;但 Go 语言仍保留了名为“方法&#xff08;method&#xff09;”的语法元素。当然&#xff0c;Go 语言中的方法和面向对象中的方…

C++------map和set的使用

文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器 什么是关联式容器&#xff1f;它与序列式容器有什么区别&#xff1f; 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key&#xff0c;value>结…

【数据结构】手撕顺序表

一&#xff0c;概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储&#xff1b; 在数组上完成数据的增删查改。 1&#xff0c; 静态顺序表&#xff1a;使用定长数组存储元素。 2.&#xff0c;动态顺序表&#xff1…

系统架构设计高级技能 · 云原生架构设计理论与实践

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

webservice调用对接第三方系统

#webservice调用对接第三方系统# 最近接到一个任务&#xff0c;需要对接第三方数据&#xff0c;第三方提供对接方式的是通过webservice调用&#xff0c;webservice调用有好几种方式&#xff0c;具体可以自行了解&#xff0c;我选择的是通过wsdl文件自动生成客户端代码对接。 …

基于野狗算法优化的BP神经网络(预测应用) - 附代码

基于野狗算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于野狗算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.野狗优化BP神经网络2.1 BP神经网络参数设置2.2 野狗算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

计算机毕设之Python的高校成绩分析(含文档+源码+部署)

本系统阐述的是一个高校成绩分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。…

[Android]JNI的基础知识

目录 1.什么是JNI 2.配置JNI开发环境NDK 3.创建Native C类型的项目 4. 了解CMakeLists.txt 文件 5.了解native-lib.cpp 文件 6.在 Android 的 MainActivity 中调用 native-lib.cpp 中实现的本地方法 1.什么是JNI JNI&#xff08;Java Native Interface&#xff09;是一…

2023年8月22日OpenAI推出了革命性更新:ChatGPT-3.5 Turbo微调和API更新,为您的业务量身打造AI模型

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

记录--怎么实现一个3d翻书效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本篇主要讨论以下两种翻书动画的实现&#xff1a; 第一种是整页翻转的效果&#xff1a; 这种整页翻转的效果主要是做rotateY的动画&#xff0c;并结合一些CSS的3d属性实现。 第二种折线翻转的效果&…

【项目 计网7】4.20 多进程实现并发服务器 4.22 多线程实现并发服务器

文章目录 4.20 多进程实现并发服务器server_process.cclient.c4.22 多线程实现并发服务器客户端代码&#xff1a;服务端代码&#xff1a; 4.20 多进程实现并发服务器 要实现TCP通信服务器处理并发的任务&#xff0c;使用多线程或者多进程来解决。 思路&#xff1a; 1、一个父进…

企业微信cgi-bin/gateway/agentinfo接口存在未授权访问漏洞 附POC

文章目录 企业微信cgi-bin/gateway/agentinfo接口存在未授权访问漏洞 附POC1. 企业微信cgi-bin/gateway/agentinfo接口简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 企业微信cgi-bin/gateway/agentinfo接口存在未授权访问漏洞 附POC 免…

java ReentrantLock 锁 await、signal的用法

背景 在并发编程中&#xff0c;为了保证线程的原子执行&#xff0c;需要使用锁&#xff0c;jvm 内 可以使用 synchronized 和 ReentrantLock&#xff0c;如果是集群部署&#xff0c;我们可以使用Redis 分布式锁 其他的锁后面再介绍。 ReentrantLock 和 synchronized 1、Reent…

深入浅出AXI协议(3)——握手过程

一、前言 在之前的文章中我们快速地浏览了一下AXI4协议中的接口信号&#xff0c;对此我们建议先有一个简单的认知&#xff0c;接下来在使用到的时候我们还会对各种信号进行一个详细的讲解&#xff0c;在这篇文章中我们将讲述AXI协议的握手协议。 二、握手协议概述 在前面的文章…

nowcoder NC236题 最大差值

目录 题目描述&#xff1a; 示例1 示例2 题干解析&#xff1a; 暴力求解&#xff1a; 代码展示&#xff1a; 优化&#xff1a; 代码展示&#xff1a; 题目跳转https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204?tpId128&tqId33768&ru/exa…

云南森林火灾vr消防模拟安全演练系统训练消防员火灾和事故的适应和应对能力

据统计,每一场破坏性地震发生后,会引发次生的灾害,而火灾是其中之一。导致火灾的原因,推测是地震时使供电线路短路,引燃易燃物,火灾就随即发生。所以,在日常生活中,定期的消防演练还是非常必要的, VR消防&#xff0c;是VR公司深圳华锐视点利用VR虚拟现实技术&#xff0c;将VR和…