有问题或建议,欢迎留言。你们每一次点赞、批评都是我前进的动力

目录

一、你的大脑在想什么

二、欢迎来到王者荣耀之英雄设计

三、开始撸代码

四、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()方法,
英雄不在亲自处理移动行为和回城行为了,而是委托给moveBehaviorrecallBehavior处理,move()recall()直接从moveBehaviorrecallBehavior接口对象中调用

三、开始撸代码

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薙

设计模式入门(王者荣耀之设计英雄篇)相关推荐

  1. 王者英雄胜率用计算机怎么算,王者荣耀征召局英雄胜率怎么计算

    标签: 后羿 王者荣耀征召局英雄胜率怎么计算 王者荣耀征召局英雄胜率怎么算?然而谁能知道这个关键比例啊,助手里面排位赛只有两个数据,一个胜率,一个出场率,出场率只能让我知道这个英雄多不多人玩而已.下面 ...

  2. 《王者荣耀》新英雄金蝉携86版西游记联动皮肤登场,你期待吗?

    自东土而来,往西途而去:以前梦为引,向信念而行. 今天上午,@王者荣耀 官微正式发文宣布,<王者荣耀>新英雄金蝉即将上线,其原型就是四大名著<西游记>中最重要的人物之一唐僧. ...

  3. 王者荣耀中一个英雄是怎么被产生的?

    点击关注公众号,Java干货及时送达 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/ ...

  4. queryselectorall 怎么取name_用这个方法,我爬取了《王者荣耀》《英雄联盟》等游戏皮肤图片...

    本文简介:本文使用Python制作爬虫,来爬取<英雄联盟><王者荣耀><神之浩劫>等游戏官方网站的英雄皮肤图片.可以作为新手爬虫的练手实战案例!! 爱打游戏的各位肯 ...

  5. 2020年王者荣耀怎么设置英雄装备

    2020年王者荣耀怎么设置英雄装备 点击备战,再点击局内道具 即可设置王者英雄装备 点击备战,再点击局内道具 即可设置王者英雄装备

  6. 常用英雄胜率怎么刷_王者荣耀怎么刷英雄胜率和场次胜率方法解析

    王者荣耀怎么刷英雄胜率?怎么刷场次胜率?在游戏中,想要保持高胜率是一件不容易的事情,那么哪些英雄上分高且胜率也高呢?下面小编就在这里给各位玩家盘点下王者荣耀不败神话的英雄合集. 怎么刷英雄胜率 140 ...

  7. 设计模式之美总结(设计原则篇)

    title: 设计模式之美总结(设计原则篇) date: 2022-10-27 17:31:42 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...

  8. 用python统计王者荣耀里所有英雄的技能描述文本量并排序

    目标 对于我来说,学习新英雄的第一件事便是查看其技能描述.因此,我相信技能描述的文本量对于一个英雄的上手难度有着不小的影响. 因此,我希望能统计出王者荣耀里所有英雄的技能描述文本量,并对其排序,这样也 ...

  9. 容错性低是什么意思_王者荣耀容错性低英雄盘点!玩家看不起他们!

    模拟战精品攻略和超强大神,来这给你安排的明明白白 玩王者荣耀,必须早知道这些版本的改动,才能让你游戏6得飞起 王者荣耀有很多英雄打到分段高的局都是会被队友嫌弃的,因为在玩家眼里这些英雄的容错率相对于版 ...

最新文章

  1. mysql怎么判断2个时间戳为同一天_请教一个需求js怎么判断时间戳是否属于同一天...
  2. [数据库]Oracle和mysql中的分页总结
  3. python quirk
  4. 字符串中最后一个单词长度
  5. appcrash事件java,java – SpringBoot应用程序崩溃
  6. 1. UI Tests简介
  7. 1.10 卷积神经网络示例
  8. 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
  9. js实现页面滚动,菜单固定
  10. ISO 9001 质量标准体系 免费下载
  11. Photoshop安装包破解安装教程
  12. 天津少儿编程培训,日本小学生正在把你甩在身后 ​
  13. Canvas特效动画
  14. 共享 满城尽带黄金甲 在线免费观看网址
  15. git(7)自定义 Git
  16. 【安全】整合spring security
  17. 无线通信怎样把信号发射出去
  18. TeeChart 4.2021.8.23 for .Net-Crack
  19. python课程水平测试成绩查询_学业水平测试(学业水平考试成绩查询系统)
  20. Java并发编程——初识JUC

热门文章

  1. U3D的坑坑洼洼(1)
  2. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用42
  3. 明明花钱买了VIP,为何仍逃不过花式插入的广告?
  4. 十大盗版软件你用了几个?
  5. 手机端省市区三级联动
  6. MemoryError: Unable to allocate array with shape (61721, 16000) and data typ
  7. 行驶证识别sdk的功能
  8. Matlab 图片转gif
  9. 【Pycharm教程】代码调试、git操作、连接远程服务器
  10. 微软开放技术云浪生:微软开源.NET是民心之所向