【Java设计模式】策略设计模式

不念不忘少年蓝@ 2022-05-26 06:09 377阅读 0赞

最近看了一点设计模式,文章例子是来自HeadFirst中的。

我们假设一种场景:在一个游戏中有多种角色,每个角色只能使用一种武器,但是可以切换武器,这个场景需要怎么设计呢?

策略设计模式:它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换 。

哇,这个概念真的好长,我一看就头疼。。。

其实我们在做面向接口编程的时候就是用到了策略模式!

UML类图:

2018042619153757

每个具体人物继承或者实现了一个抽象类或接口。角色持有一个武器的接口引用,当我们需要给角色换武器的时候,我们只需要给角色里的接口引用传入不同的实现类就行了,而我们的代码并不需要改变。这就是一种把变化的部分和不变的部分分离开的思想。

下面我们来看一下代码的实现:首先我们创建一个角色的抽象类

  1. package design.pattern.strategic;
  2. /**
  3. * @author Lion
  4. * @since 2018/4/24 11:58
  5. * 角色类
  6. */
  7. public abstract class AbstractCharacter {
  8. private WeaponBehavior weaponBehavior;
  9. public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
  10. this.weaponBehavior = weaponBehavior;
  11. }
  12. public WeaponBehavior getWeaponBehavior() {
  13. return weaponBehavior;
  14. }
  15. /**
  16. * 每种武器有不同的攻击方式
  17. * */
  18. abstract void fight();
  19. }

然后创建我们的角色:

King.class

  1. package design.pattern.strategic;
  2. /**
  3. * @author Lion
  4. * @since 2018/4/24 12:55
  5. */
  6. public class King extends AbstractCharacter {
  7. @Override
  8. void fight() {
  9. getWeaponBehavior().userWeapon();
  10. }
  11. }

Queen.class

  1. package design.pattern.strategic;
  2. /**
  3. * @author Lion
  4. * @since 2018/4/24 12:55
  5. */
  6. public class Queen extends AbstractCharacter {
  7. @Override
  8. void fight() {
  9. getWeaponBehavior().userWeapon();
  10. }
  11. }

创建我们的武器接口:

  1. package design.pattern.strategic;
  2. /**
  3. * @author Lion
  4. * @since 2018/4/24 11:54
  5. * 武器策略接口
  6. */
  7. public interface WeaponBehavior {
  8. /**
  9. * 使用武器
  10. * */
  11. void userWeapon();
  12. }

创建具体的武器对象:

  1. package design.pattern.strategic;
  2. /**
  3. * @author Lion
  4. * @since 2018/4/24 12:01
  5. * 大宝剑策略
  6. */
  7. public class SwordBehavior implements WeaponBehavior {
  8. @Override
  9. public void userWeapon() {
  10. System.out.println("大宝剑!!!");
  11. }
  12. }
  13. package design.pattern.strategic;
  14. /**
  15. * @author Lion
  16. * @since 2018/4/24 12:01
  17. * 匕首策略
  18. */
  19. public class KnifeBehavior implements WeaponBehavior {
  20. @Override
  21. public void userWeapon() {
  22. System.out.println("小匕首。。。");
  23. }
  24. }

运行一下:

  1. public static void main(String[] args) {
  2. //王
  3. King king = new King();
  4. king.setWeaponBehavior(new SwordBehavior());
  5. king.fight();
  6. //后
  7. Queen queen = new Queen();
  8. queen.setWeaponBehavior(new KnifeBehavior());
  9. queen.fight();
  10. }

由于我们传入的武器对象不一样,所以两个人物的行为不一样。

发表评论

表情:
评论列表 (有 0 条评论,377人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java设计模式-策略模式

    什么是策略模式: 策略模式就是处理类型较多,算法比较复杂,代码流程控制比较多,而且难以拓展,这时候,我们就可以使用策略模式了 开发中常用策略模式场景: 1.Sprin

    相关 java设计模式 - 策略模式

    设计一个小游戏 需求 要设计这样一个应用小游戏,游戏里面有不同类的任务,他们通过战斗打架赢得胜利,这些人物通过使用武器和使用法术战斗。 所有的人

    相关 java设计模式-策略模式

    java设计模式-策略模式 2016.12.07 13:56 1296浏览 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式

    相关 java设计模式-策略模式

    定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 认识策略模式 策略模式的重心