设计模式入门(王者荣耀之设计英雄篇)
有问题或建议,欢迎留言。你们每一次点赞、批评都是我前进的动力
目录
一、你的大脑在想什么
二、欢迎来到王者荣耀之英雄设计
三、开始撸代码
四、00原则
一、你的大脑在想什么
大部分学习是一件充满乏味和反人性(克服懒惰)的事(i薙鱼导师:琦大大),假如野人我们的祖先不学会使用火和工具,那么可能就没有现在的我们了,一切都是为了部落,为了生存。[FollowMe]我会尽力使学习过程变得比较轻松愉悦。设计模式是前辈们总结的经验和智慧,就好比武林绝学葵花宝典(还不需要你自宫,简直不要太棒!)
1.1 谁适合读这篇文章
√你懂Java么?(不求精通,会就行了);
√你想学习,了解,记得并应用设计模式,以及其所基于00设计原则么?;
√你是不是更喜欢一种轻松的氛围,就像在餐桌上交谈一样,而不愿意被动地听技术报告似的枯燥乏味的说教?
1.2 大脑记忆是如何工作的
有些事情只发生了一次但是你记得十分清楚,比如游泳差点淹死、被人打、被人羞辱或是很尴尬的瞬间等等,这时大脑会强化记忆“这[TM]太重要了,下次一定不能让这种事情发生了”。
亦或是表白成功、走上了人巅峰,这时大脑也会强化记忆“这么高光的时刻,太重要了,我要好好记住”。
还有反复多次的去背单词,十遍二十遍,最终你记住了。大脑被动记忆“既然出现这么多次,那一定很重要吧,我就勉为其难的记住它了”
而我所要做的就是尽我所能让你的大脑兴奋起来,这样你就会对所学的设计模式知识印象更为深刻,理解更加透彻here we go
二、欢迎来到王者荣耀之英雄设计
2.1 设计英雄
2.2 新英雄设计(远古版本)
技术总监罗工:“最近我们要出一款新英雄,辅助孙膑,模型已经设计好了,你们把底层代码写写吧!”,研发鱼:“ok,收到!”,然后薙鱼下去开始兴奋的写起了代码,灵光一闪想起来孙膑不是被膑足(夏商五刑之一,又称刖刑,是断足或砍去犯人膝盖骨的刑罚)了么,他不可能走路的耶,所以一定是得用飘的,哈哈,机智如我,开干。
2.3 翌日(第二天)
游戏测试小z发了一篇测试报告和录频到研发的群里@薙鱼,整个群里炸开了锅,天哪所有的英雄的都飞了起来。薙鱼顿时吓得目瞪口呆,这时罗工冲冲的走了过来,你丫的干啥呢,猪八戒都上天了你知道么!薙鱼方才缓过神来,小声嘟囔了一句:“八戒会飞的呀”。
说归说,闹归闹,别拿代码(饭碗)开玩笑,嘿嘿,这就去改喽。
2.4 马总发言
马总笑口颜开的说到:“咱们公司这个王者荣耀啊,做的非常棒,为公司带来巨大的收益,在座各位都辛苦啦!你们年底年终奖翻倍”(啪啪啪…掌声雷动)。不过呢最近有位粉丝在微博@我说:“马爸爸,我今年12岁,很喜欢你们公司的王者荣耀这款游戏,但是每次回城的时候让我很失望”,我问他说:“为什么呀?,他说虽然我皮肤都是荣耀典藏的,但是回城的时候嗖的一下就会回去了,而且所有英雄都一样,毫无创意和体验感,完全不能将我和那些白嫖党分别开,我不快乐”。你们都懂了么?。话音刚落底下异口同声的答到:“我们知道了,马总!”,啪啪啪…掌声停,会议散。
从上面不难看出继承会导致一些不好影响:
- 运行时的行为不容易改变
- 改变会牵一发动全身,引起大麻烦
- 很难知道英雄的全部行为,比如新出的英雄澜,会走walk还会游泳swim
2.5 一般接口方式
这样看似时解决了问题,但随之而来的是:
- 直接继承接口无法达到代码复用的效果
- 修改某一个行为时,必须往下追踪,并在每一个定义此行为的类中修改它,一不小心就会造成新的错误
2.6 针对接口编程,而不针对实现
这样的设计,可以让飞行和回城动作被其它对象复用,因为这些行为已经和英雄类无关了。而我们可以新增一些行为,不会影响到既有的行为类,也不会影响到使用到飞行行为的英雄。
2.7 英雄的行为
我们用两个相似的方法
performMove()
和performRecall()
取代Hero
类中的move()
和recall()
方法,
英雄不在亲自处理移动行为和回城行为了,而是委托给moveBehavior
和recallBehavior
处理,move()
和recall()
直接从moveBehavior
和recallBehavior
接口对象中调用三、开始撸代码
3.1 移动方式
/*** 移动行为* @author ITyushuo**/ public interface MoveBehavior {void move(); }
/*** 游泳* @author ITyushuo**/ public class Swim implements MoveBehavior {@Overridepublic void move() {System.out.println("峡谷河道游泳");} }
/*** 行走* @author ITyushuo**/ public class Walk implements MoveBehavior {@Overridepublic void move() { System.out.println("峡谷间行走");} }
/*** 飞行* @author ITyushuo**/ public class Fly implements MoveBehavior {@Overridepublic void move() { System.out.println("峡谷间飞来飞去"); } }
3.2 回城动作
/*** 回城行为* @author ITyushuo**/ public interface RecallBehavior {void recall(); }
/*** 站立回城* @author ITyushuo**/ public class StandUp implements RecallBehavior {@Overridepublic void recall() {System.out.println("原皮白嫖党,站立回城");} }
/*** 时空穿梭* @author ITyushuo**/ public class Shuttle implements RecallBehavior {@Overridepublic void recall() {System.out.println("时空穿梭回城啦!");} }
3.3 英雄抽象类
/*** 英雄* @author ITyushuo**/ public abstract class Hero {MoveBehavior moveBehavior;RecallBehavior recallBehavior;public int level;/*** 被动技能*/public abstract void passiveSkill();/*** 移动*/public void performMove() {moveBehavior.move();}/*** 回城*/public void performRecall() {recallBehavior.recall();}/*** 升级+点(升一级)* */public void upgrade() {if (level >= 15) {System.out.println("已经是最高等级,不能再升级");return;}level++;System.out.println("升级为:"+level+"级");}public void setMoveBehavior(MoveBehavior moveBehavior) {this.moveBehavior = moveBehavior;}public void setRecallBehavior(RecallBehavior recallBehavior) {this.recallBehavior = recallBehavior;}public int getLevel() {return level;}public void setLevel(int level) {this.level = level;}}
/*** 狄仁杰* @author ITyushuo**/ public class Direnjie extends Hero {public final static String HERO_NAME = "英雄:狄仁杰(超时空战士)";@Overridepublic void passiveSkill() {System.out.println("迅捷:每次普攻获得一层迅捷效果,每层迅捷效果增加6%攻速和5%移速,最多叠5层");}}
/*** 孙膑* @author ITyushuo**/ public class Sunbin extends Hero {public final static String HERO_NAME = "英雄:孙膑";@Overridepublic void passiveSkill() {System.out.println("时间沙漏:释放技能会提高30%的移动速度,持续两秒");}}
/*** 澜* @author ITyushuo**/ public class Lan extends Hero {public final static String HERO_NAME = "英雄:澜";@Overridepublic void passiveSkill() {System.out.println("猎杀:但生命值低于30%,会被澜视作“猎物”,澜对猎物将会额外造成10%的伤害");}}
3.4 召唤师峡谷测试
/*** 召唤师峡谷测试* @author ITyushuo**/ public class SummonersCanyonTest {public static void main(String[] args) {MoveBehavior walk = new Walk();RecallBehavior shuttle = new Shuttle();//穿越时空虫洞Hero direnjie = new Direnjie(); //创建英雄System.out.println(Direnjie.HERO_NAME); //打印英雄名direnjie.setMoveBehavior(walk);//设置移动行为direnjie.setRecallBehavior(shuttle);//设置回城动作direnjie.setLevel(15);//设置英雄等级direnjie.upgrade();//召唤师加点升一级direnjie.performMove();//移动direnjie.performRecall();//回城System.out.println("----------------");MoveBehavior swim = new Swim();//游泳移动RecallBehavior standUp = new StandUp();//站立回城Hero lan = new Lan();System.out.println(Lan.HERO_NAME);lan.setMoveBehavior(swim);lan.setRecallBehavior(standUp);lan.setLevel(4);lan.upgrade();//升一级lan.performMove();lan.setMoveBehavior(walk);System.out.println("一技能效果消失或游出河道时:");lan.performMove();lan.performRecall();System.out.println("----------------");MoveBehavior fly = new Fly();//飞行移动Hero sunbin = new Sunbin();System.out.println(Sunbin.HERO_NAME);sunbin.setMoveBehavior(fly);sunbin.setRecallBehavior(standUp);sunbin.setLevel(1);sunbin.upgrade();//升一级sunbin.performMove();sunbin.performRecall();} }
3.5 测试结果
英雄:狄仁杰(超时空战士)
已经是最高等级,不能再升级
峡谷间行走
时空穿梭回城啦!
英雄:澜
升级为:5级
峡谷河道游泳
一技能效果消失或游出河道时:
峡谷间行走
原皮白嫖党,站立回城
英雄:孙膑
升级为:2级
峡谷间飞来飞去
原皮白嫖党,站立回城四、00原则
- 封装变化
- 多用组合,少用继承
- 针对接口编程,不针对实现编程
- 为交互对象之间的松耦合而不懈努力
☝
【扫描二维码识别关注不迷路】
本文参考来源
书籍:HeadFirst设计模式
23种设计模式2021读书计划
x技术类书籍0/8本 未完成
x文学类书籍0/2本 未完成
x财经类书籍0/2本 未完成
如果觉得本文对你或你的小伙伴有所帮助,可以帮我推荐转发,希望能帮助更多像我一样喜欢这种扯淡式学习的IT人。你们的支持是我前进的动力。
我是i薙设计模式入门(王者荣耀之设计英雄篇)相关推荐
- 王者英雄胜率用计算机怎么算,王者荣耀征召局英雄胜率怎么计算
标签: 后羿 王者荣耀征召局英雄胜率怎么计算 王者荣耀征召局英雄胜率怎么算?然而谁能知道这个关键比例啊,助手里面排位赛只有两个数据,一个胜率,一个出场率,出场率只能让我知道这个英雄多不多人玩而已.下面 ...
- 《王者荣耀》新英雄金蝉携86版西游记联动皮肤登场,你期待吗?
自东土而来,往西途而去:以前梦为引,向信念而行. 今天上午,@王者荣耀 官微正式发文宣布,<王者荣耀>新英雄金蝉即将上线,其原型就是四大名著<西游记>中最重要的人物之一唐僧. ...
- 王者荣耀中一个英雄是怎么被产生的?
点击关注公众号,Java干货及时送达 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/ ...
- queryselectorall 怎么取name_用这个方法,我爬取了《王者荣耀》《英雄联盟》等游戏皮肤图片...
本文简介:本文使用Python制作爬虫,来爬取<英雄联盟><王者荣耀><神之浩劫>等游戏官方网站的英雄皮肤图片.可以作为新手爬虫的练手实战案例!! 爱打游戏的各位肯 ...
- 2020年王者荣耀怎么设置英雄装备
2020年王者荣耀怎么设置英雄装备 点击备战,再点击局内道具 即可设置王者英雄装备 点击备战,再点击局内道具 即可设置王者英雄装备
- 常用英雄胜率怎么刷_王者荣耀怎么刷英雄胜率和场次胜率方法解析
王者荣耀怎么刷英雄胜率?怎么刷场次胜率?在游戏中,想要保持高胜率是一件不容易的事情,那么哪些英雄上分高且胜率也高呢?下面小编就在这里给各位玩家盘点下王者荣耀不败神话的英雄合集. 怎么刷英雄胜率 140 ...
- 设计模式之美总结(设计原则篇)
title: 设计模式之美总结(设计原则篇) date: 2022-10-27 17:31:42 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...
- 用python统计王者荣耀里所有英雄的技能描述文本量并排序
目标 对于我来说,学习新英雄的第一件事便是查看其技能描述.因此,我相信技能描述的文本量对于一个英雄的上手难度有着不小的影响. 因此,我希望能统计出王者荣耀里所有英雄的技能描述文本量,并对其排序,这样也 ...
- 容错性低是什么意思_王者荣耀容错性低英雄盘点!玩家看不起他们!
模拟战精品攻略和超强大神,来这给你安排的明明白白 玩王者荣耀,必须早知道这些版本的改动,才能让你游戏6得飞起 王者荣耀有很多英雄打到分段高的局都是会被队友嫌弃的,因为在玩家眼里这些英雄的容错率相对于版 ...
最新文章
- mysql怎么判断2个时间戳为同一天_请教一个需求js怎么判断时间戳是否属于同一天...
- [数据库]Oracle和mysql中的分页总结
- python quirk
- 字符串中最后一个单词长度
- appcrash事件java,java – SpringBoot应用程序崩溃
- 1. UI Tests简介
- 1.10 卷积神经网络示例
- 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
- js实现页面滚动,菜单固定
- ISO 9001 质量标准体系 免费下载
- Photoshop安装包破解安装教程
- 天津少儿编程培训,日本小学生正在把你甩在身后 ​
- Canvas特效动画
- 共享 满城尽带黄金甲 在线免费观看网址
- git(7)自定义 Git
- 【安全】整合spring security
- 无线通信怎样把信号发射出去
- TeeChart 4.2021.8.23 for .Net-Crack
- python课程水平测试成绩查询_学业水平测试(学业水平考试成绩查询系统)
- Java并发编程——初识JUC
热门文章