英雄联盟之「策略模式」

作者: 陈宇明 | 来源:发表于2016-09-12 20:47 被阅读4026次

    之前写过一篇什么是「设计模式」?,没有类图,没有代码,有些同学说看不太懂,今天给大家带来策略模式(有图,有码,有真相!)。

    英雄联盟(LOL)
    玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技术来设计这些英雄该怎么办?
    小明:简单,先来个父类(Superclass),然后让所有的英雄继承此父类,不同的方法重写父类方法即可。


    每个英雄的QWER技能都是不一样的,重写可以没问题,但是召唤师技能每个英雄都是固定的几个难不成也都要子类重写?
    小明:对哦,召唤师技能如果都让子类重写那么就会产生多个子类代码重复,怎么办呢?

    设计原则:找出应用可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

    小明:变化之处那就是召唤师技能,可以把召唤师技能抽取出来写成一个接口,所有召唤师技能都需要实现这个接口。

    设计原则:针对接口编程,而不是针对实现编程。

    小明:这样可以把所有固定的召唤师技能先写好,等玩家选择召唤师技能只需要设置具体的召唤师技能即可。就算以后有新的召唤师技能只需要实现这个接口就好了,具体实现类可以互相的替换。

    设计原则:多用组合,少用继承。

    小明:思路理清楚了,那就直接上代码。

    召唤师技能接口

    public interface 召唤师技能 { 
    
    public void 技能();
    
    }
    

    具体实现

    public class 治疗术 implements 召唤师技能 {
    
    public void 技能(){
      //为你的英雄和附近的友军回复生命值。
    };
    
    }
    

    英雄类

    public class 英雄 {
    
       public void 召唤师技能(召唤师技能 技能){
          技能变量.技能();
       }
    }
    

    客户端

    public class 客户端 { 
    public static void main(String[] args) { 
    //选择并创建需要使用的策略对象 
    召唤师技能 我的治疗术 = new 治疗术(); 
    //创建环境 
    英雄 我的盖伦 = new 盖伦(); 
    //使用策略
    我的盖伦.召唤师技能(我的治疗术);
     }
    }
    

    这就是所谓的「策略模式」了,定义了算法(召唤师技能接口),分别封装起来(具体的实现类:传送、治疗术),让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

    以上代码块用中文编写类名、变量名是为了让大家更好的理解,在实战过程中记得替换成相对应的英文。

    画图工具:
    Giffy Diagrams
    相关阅读:
    BRVAH之添加动画(策略模式)
    扩展阅读:
    如何实施代码重构?
    参考书籍:
    《Head First 设计模式》

    相关文章

      网友评论

      • 大熊小鸽鸽:你好,希望你以后有时间的话,能以同样的方式,再说说别的设计模式。我相信大家都不喜欢官方的口吻来说设计模式。
        陈宇明:好的,这段时间比较忙,果断时间更新
      • 大熊小鸽鸽:你这种当时很容易理解!
        大熊小鸽鸽: @MrXionGe 方式
      • Doge_developer:写得很棒
      • Flyzend:一文读懂策略模式
      • cd6bf311e831:66666好理解
      • 38ee123d3468:看了几次策略模式,这次是最清晰的
      • 捡淑:66666
      • wo叫天然呆:很好的一种写作风格,让我想起Head First
      • 20ffdd1f5b75:实现了召唤师技能接口,子类还是要实现接口里的方法,反正召唤师技能都是一样的,干嘛不写在父类里呢,让子类直接继承就行了
        陈宇明:@路飞的冰凌花 不是每个英雄都要实现召唤师技能接口,是所有召唤师技能都需要实现召唤师接口,玩家共用所有召唤师技能的具体实现,这样代码不会重复,而是会被复用。这样就算有新的召唤师技能也只需要实现以下召唤师技能接口就可以了,不需要修改父类。
        20ffdd1f5b75:@陈宇明 我只是觉得每个英雄都要实现召唤师技能接口,都要实现其方法,而其方法的内容又是一样的,写成接口话会出现很多代码的冗余。况且即便要增加新的召唤师技能,直接在父类里增添就行了。
        陈宇明:@路飞的冰凌花 全部写在父类?这样如果要扩展的话那就要修改父类了。
      • 雾里看花最是迷人:这种方式不错哦,活学活用😁
        陈宇明:@青春进行时 学以致用😁
      • 004770c35f5f:没有实现闪现接口,差评
        kij:@棒子郁达夫 治疗加屏障你一定没用过 ,double kill
        陈宇明:@棒子郁达夫 闪现+点燃,必不可少。
      • 67245d173000:写的很好,不过我的编程水平好像还没有达到这个层次耶😳
        陈宇明:@菜鸟来袭 加油,慢慢来,比较快。
      • 人鱼飞燕:要是以写代码的角度去玩这个游戏会怎么样,能发现它本质的规律吗
        陈宇明:@人鱼飞燕 😂没试过。
      • 623e9ec16d5f:厉害了我的哥
      • 菲利柯斯::joy:喜欢了英文汉字一下懵逼了
        陈宇明:@菲利柯斯 😂
      • funnyzhao:标题吸引了我~ 哈哈,很喜欢这样的写作风格
        陈宇明:@funnyzhao 第一次用这种风格写,习惯就好😂

      本文标题:英雄联盟之「策略模式」

      本文链接:https://www.haomeiwen.com/subject/bytpettx.html