23种设计模式之策略模式

打印 上一主题 下一主题

主题 839|帖子 839|积分 2517

1. 简介

策略模式(Strategy Pattern) 是一种行为设计模式。它界说了一系列算法,将每个算法都封装起来,而且使它们可以相互更换。策略模式让算法的变化独立于使用算法的客户。
比方,想象一个角色扮演游戏,游戏中的角色有不同的攻击方式,如近战攻击、长途攻击和魔法攻击。这些攻击方式可以看作是不同的策略,而角色可以根据环境(如敌人的位置、自身状态等)选择不同的攻击策略。
策略模式的布局


  • 策略(Strategy)接口
    这是全部具体策略类都要实现的接口。它界说了一个通用的行为方法。
  • 具体策略(Concrete Strategy)类
    这些类实现了策略接口,提供了具体的算法实现。
  • 上下文(Context)类
    这个类持有一个策略对象的引用,并通过该引用调用策略对象的方法。
2. 代码

2.1 Strategy (策略接口)

  1. public interface Strategy {
  2.     public int operation(int a, int b);
  3. }
复制代码
2.2 AddStrategy (具体策略类)

  1. public class AddStrategy implements Strategy{
  2.     @Override
  3.     public int operation(int a, int b) {
  4.         return a + b;
  5.     }
  6. }
复制代码
2.3 SubStrategy (具体策略类)

  1. public class SubStrategy implements  Strategy{
  2.     @Override
  3.     public int operation(int a, int b)
  4.     {
  5.         return a-b;
  6.     }
  7. }
复制代码
2.4 MultiplyStrategy (具体策略类)

  1. public class MultiplyStrategy implements Strategy{
  2.     @Override
  3.     public int operation(int a, int b)
  4.     {
  5.         return a*b;
  6.     }
  7. }
复制代码
2.5 Operation (上下文类)

  1. public class Operation {
  2.     private Strategy strategy;
  3.     public Operation(Strategy strategy) {
  4.         this.strategy = strategy;
  5.     }
  6.     public int execute(int a, int b) {
  7.         return strategy.operation(a, b);
  8.     }
  9. }
复制代码
2.6 Test (测试)

  1. public class Test {
  2.     public static void main(String[] args) {
  3.         Operation operation = new Operation(new AddStrategy());
  4.         System.out.println("1 + 2 = " + operation.execute(1, 2));
  5.         operation = new Operation(new SubStrategy());
  6.         System.out.println("1 - 2 = " +operation.execute(1, 2));
  7.         operation = new Operation(new MultiplyStrategy());
  8.         System.out.println("1 * 2 = " +operation.execute(1, 2));
  9.     }
  10. }
复制代码
2.7 运行结果

  1. 1 + 2 = 3
  2. 1 - 2 = -1
  3. 1 * 2 = 2
复制代码
3. 优缺点



  • 策略模式的优点

    • 可扩展性好
      当需要添加新的策略时,只需要创建一个新的具体策略类并实现策略接口即可。比方,在游戏中假如要添加一种新的 “召唤攻击策略”,只需要编写一个新的类实现 “AttackStrategy” 接口,而不需要修改角色类(上下文类)的主要逻辑。
    • 易于维护
      由于每个策略都是独立的类,所以代码的职责明确。假如某个策略的算法出现问题,只需要在对应的策略类中进行修改,不会影响到其他策略。
    • 代码复用性高
      不同的上下文对象可以复用相同的策略类。比如在游戏中有多个角色都可以使用长途攻击策略,这个策略类就可以被复用。

  • 策略模式的缺点

    • 增加了类的数量
      每一个策略都需要一个单独的类来实现,这可能会导致项目中的类数量增多。在简单的场景下,假如策略不多,这种开销可能不明显,但在复杂的系统中,过多的类可能会使代码的组织布局变得复杂。
    • 客户端必须相识策略之间的区别
      客户端(使用策略的代码)需要知道每个策略的具体行为,才能精确地选择和使用策略。在上面的游戏例子中,游戏开辟者需要清晰地知道近战攻击、长途攻击等策略的特点,才能公道地为角色配置策略。

4. 总结



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表