设计模式之王者荣耀英雄设计

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

内容目录

一、你的大脑在想什么
1.1 谁适合读这篇文章
1.2 大脑记忆是如何工作的

二、欢迎来到王者荣耀之英雄设计2.1 设计英雄2.2 新英雄设计(远古版本)
2.3 翌日(第二天)
2.4 马总发言
2.5 一般接口方式
2.6 针对接口编程,而不针对实现
2.7 英雄的行为

三、开始撸代码3.1 移动方式
3.2 回城动作
3.3 英雄抽象类
3.4 召唤师峡谷测试
3.5 测试结果
四、00原则

一、你的大脑在想什么

大部分学习是一件充满乏味和反人性(克服懒惰)的事(i薙鱼导师:琦大大),假如野人我们的祖先不学会使用火和工具,那么可能就没有现在的我们了,一切都是为了部落,为了生存。[FollowMe]我会尽力使学习过程变得比较轻松愉悦。设计模式是前辈们总结的经验和智慧,就好比武林绝学葵花宝典(还不需要你自宫,简直不要太棒!)

1.1 谁适合读这篇文章

你懂Java么?(不求精通,会就行了);

你想学习,了解,记得并应用设计模式,以及其所基于00设计原则么?;

你是不是更喜欢一种轻松的氛围,就像在餐桌上交谈一样,而不愿意被动地听技术报告似的枯燥乏味的说教?

1.2 大脑记忆是如何工作的

有些事情只发生了一次但是你记得十分清楚,比如游泳差点淹死、被人打、被人羞辱或是很尴尬的瞬间等等,这时大脑会强化记忆“这[TM]太重要了,下次一定不能让这种事情发生了”。

亦或是表白成功、走上了人巅峰,这时大脑也会强化记忆“这么高光的时刻,太重要了,我要好好记住”。

还有反复多次的去背单词,十遍二十遍,最终你记住了。大脑被动记忆“既然出现这么多次,那一定很重要吧,我就勉为其难的记住它了”

而我所要做的就是尽我所能让你的大脑兴奋起来,这样你就会对所学的设计模式知识印象更为深刻,理解更加透彻here we go

image

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

2.1 设计英雄

image

2.2 新英雄设计(远古版本)

技术总监罗工:“最近我们要出一款新英雄,辅助孙膑,模型已经设计好了,你们把底层代码写写吧!”,研发鱼:“ok,收到!”,然后薙鱼下去开始兴奋的写起了代码,灵光一闪想起来孙膑不是被膑足(夏商五刑之一,又称刖刑,是断足或砍去犯人膝盖骨的刑罚)了么,他不可能走路的耶,所以一定是得用飘的,哈哈,机智如我,开干。

image

2.3 翌日(第二天)

游戏测试小z发了一篇测试报告和录频到研发的群里@薙鱼,整个群里炸开了锅,天哪所有的英雄的都飞了起来。薙鱼顿时吓得目瞪口呆,这时罗工冲冲的走了过来,你丫的干啥呢,猪八戒都上天了你知道么!薙鱼方才缓过神来,小声嘟囔了一句:“八戒会飞的呀”。

image

说归说,闹归闹,别拿代码(饭碗)开玩笑,嘿嘿,这就去改喽。

2.4 马总发言

马总笑口颜开的说到:“咱们公司这个王者荣耀啊,做的非常棒,为公司带来巨大的收益,在座各位都辛苦啦!你们年底年终奖翻倍”(啪啪啪…掌声雷动)。不过呢最近有位粉丝在微博@我说:“马爸爸,我今年12岁,很喜欢你们公司的王者荣耀这款游戏,但是每次回城的时候让我很失望”,我问他说:“为什么呀?,他说虽然我皮肤都是荣耀典藏的,但是回城的时候嗖的一下就会回去了,而且所有英雄都一样,毫无创意和体验感,完全不能将我和那些白嫖党分别开,我不快乐”。你们都懂了么?。话音刚落底下异口同声的答到:“我们知道了,马总!”,啪啪啪…掌声停,会议散。

image

从上面不难看出继承会导致一些不好影响:

  • 运行时的行为不容易改变
  • 改变会牵一发动全身,引起大麻烦
  • 很难知道英雄的全部行为,比如新出的英雄澜,会走walk还会游泳swim

2.5 一般接口方式

image

这样看似时解决了问题,但随之而来的是:

  • 直接继承接口无法达到代码复用的效果
  • 修改某一个行为时,必须往下追踪,并在每一个定义此行为的类中修改它,一不小心就会造成新的错误

2.6 针对接口编程,而不针对实现

image

这样的设计,可以让飞行和回城动作被其它对象复用,因为这些行为已经和英雄类无关了。而我们可以新增一些行为,不会影响到既有的行为类,也不会影响到使用到飞行行为的英雄。

2.7 英雄的行为

我们用两个相似的方法performMove()performRecall()取代Hero类中的move()recall()方法,
英雄不在亲自处理移动行为和回城行为了,而是委托给moveBehaviorrecallBehavior处理,move()recall()直接从moveBehaviorrecallBehavior接口对象中调用

image

三、开始撸代码

3.1 移动方式

/**
 * 移动行为
 * @author ITyushuo
 *
 */
public interface MoveBehavior {
    void move();
}

/**
 * 游泳
 * @author ITyushuo
 *
 */
public class Swim implements MoveBehavior {
    @Override
    public void move() {
        System.out.println("峡谷河道游泳");
    }
}

/**
 * 行走
 * @author ITyushuo
 *
 */
public class Walk implements MoveBehavior {
    @Override
    public void move() {    
        System.out.println("峡谷间行走");
    }
}

/**
 * 飞行
 * @author ITyushuo
 *
 */
public class Fly implements MoveBehavior {
    @Override
    public void move() {        
        System.out.println("峡谷间飞来飞去");  
    }
}

3.2 回城动作

/**
 * 回城行为
 * @author ITyushuo
 *
 */
public interface RecallBehavior {
    void recall();
}

/**
 * 站立回城
 * @author ITyushuo
 *
 */
public class StandUp implements RecallBehavior {
    @Override
    public void recall() {
        System.out.println("原皮白嫖党,站立回城");
    }
}

/**
 * 时空穿梭
 * @author ITyushuo
 *
 */
public class Shuttle implements RecallBehavior {
    @Override
    public 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 = "英雄:狄仁杰(超时空战士)";

    @Override
    public void passiveSkill() {

        System.out.println("迅捷:每次普攻获得一层迅捷效果,每层迅捷效果增加6%攻速和5%移速,最多叠5层");

    }



}

/**
 * 孙膑
 * @author ITyushuo
 *
 */
public class Sunbin extends Hero {

    public final static String HERO_NAME = "英雄:孙膑";

    @Override
    public void passiveSkill() {

        System.out.println("时间沙漏:释放技能会提高30%的移动速度,持续两秒");

    }


}


/**
 * 澜
 * @author ITyushuo
 *
 */
public class Lan extends Hero {

    public final static String HERO_NAME = "英雄:澜";

    @Override
    public 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种设计模式:http://c.biancheng.net/design_pattern/

2021读书计划

x技术类书籍0/8本 未完成

x文学类书籍0/2本 未完成

x财经类书籍0/2本 未完成

如果觉得本文对你或你的小伙伴有所帮助,可以帮我推荐转发,希望能帮助更多像我一样喜欢这种扯淡式学习的IT人。你们的支持是我前进的动力。
我是i薙🐟一只会敲bug的挨踢(IT)鱼下篇再会

☝【扫码识别关注不迷路】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容