LOL设计模式之「策略模式」

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

英雄联盟(LOL)
玩过LOL的同窗都知道,LOL有上百个英雄,若是用OO技术来设计这些英雄该怎么办?
小明:简单,先来个父类(Superclass),而后让全部的英雄继承此父类,不一样的方法重写父类方法便可。

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

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

小明:变化之处那就是召唤师技能,能够把召唤师技能抽取出来写成一个接口,全部召唤师技能都须要实现这个接口。设计模式

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

小明:这样能够把全部固定的召唤师技能先写好,等玩家选择召唤师技能只须要设置具体的召唤师技能便可。就算之后有新的召唤师技能只须要实现这个接口就行了,具体实现类能够互相的替换。动画

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

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

召唤师技能接口

public interface 召唤师技能 { 

public void 技能();

}

具体实现

public class 治疗术 implements 召唤师技能 {

public void 技能(){
  //为你的英雄和附近的友军回复生命值。
};

}

英雄类

public class 英雄 {

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

客户端

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

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

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

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

相关文章
相关标签/搜索