admin 管理员组

文章数量: 1086866

策略设计模式:英雄死亡之后的处理

策略模式:定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

设计原则

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程,不针对实现编程

举例说明

场景:在LOL中有140个英雄,大部分英雄在死亡之后,屏幕变黑;而另一些英雄在死亡后,可以继续释放技能。

需求:增加英雄死亡之后的表现行为方法。

1.封装变化,把死亡之后的这两种行为封装成两个策略类;同时针对接口编程,把这两个策略类抽象成一个接口。

  • 新建死亡接口
  1. /*** 死亡接口** @author jsk* @Date 2018/11/10 12:42*/
    public interface Death {void action(String name);
    }
  • 新建两个死亡策略类
  1. /*** 继续释放技能的策略** @author jsk* @Date 2018/11/10 12:45*/
    public class ContinueStrategy implements Death {@Overridepublic void action(String name) {System.out.println(name + "已被击杀,可以继续释放5s技能!");}
    }
  • /*** 黑屏的策略** @author jsk* @Date 2018/11/10 12:46*/
    public class BlackScreenStrategy implements Death {@Overridepublic void action(String name) {System.out.println(name + "已被击杀,黑屏中,无法释放技能!");}
    }

2.多用组合,少用继承。在英雄类中使用策略接口。

  • /*** 英雄实体类** @author jsk* @Date 2018/11/10 12:40*/
    public class Hero {private String name;private Death deathStrategy;public Hero(String name, Death deathStrategy) {this.name = name;this.deathStrategy = deathStrategy;}/*** 死亡之后的行为*/public void afterDeath() {deathStrategy.action(name);}
    }

3.运行程序,使用盖伦、塞恩两个死亡之后不同表现行为的英雄实体。

  • /*** @author jsk* @Date 2018/11/10 12:52*/
    public class Main {public static void main(String[] args) {BlackScreenStrategy blackScreenStrategy = new BlackScreenStrategy();ContinueStrategy continueStrategy = new ContinueStrategy();Hero galen = new Hero("盖伦", blackScreenStrategy);Hero thane = new Hero("塞恩", continueStrategy);galen.afterDeath();thane.afterDeath();}
    }

4.运行结果

围炉夜谈

  • 少用继承的原因

复用不够灵活:如果一个英雄基类下有140个英雄子类,这写英雄的afterDeath有两种表现行为;其中120个子类的afterDeath行为与父类一致,但是剩下的20个子类一致;因为java 只支持单继承,所以剩余20个子类都需重新覆盖父类的afterDeath方法。

本文标签: 策略设计模式英雄死亡之后的处理