设计模式(策略模式)

行为型模式

  • 在策略模式中,一个类的行为或者其相应的算法可以在运行时更改;大大简化if-else的写法。
  • 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
  1. 介绍

    • 使用场景
      • 在面向对象程序设计中,如果一个对象存在多种行为选择。
      • 在一个系统程序中根据用户选择不同,有多种算法可供选择。
      • 在一个系统中有多个if-else 多重选择,并且后期还有可能进行扩展时。
    • 目的
      • 将对象的多个行为(算法)一一封装起来,并且可以根据需求,动态替换。
    • 关键要点
      • 定义好策略接口
      • 实现同一个接口
      • 创建使用策略的类
  2. 实现

    • 定义好策略接口

      package org.hdq.strategy;
      
      /**
       * @className: Strategy
       * @description: 策略接口
       * @author: huangdq
       * @date: 2023/01/29 10:11
       **/
      public interface Strategy {
      
          public int doOperation(int num1, int num2);
      
      }
      
    • 多种行为实现策略接口

      package org.hdq.strategy;
      
      /**
       * @className: AddOperation
       * @description: 相加 操作类
       * @author: huangdq
       * @date: 2023/01/29 10:14
       **/
      public class AddOperation implements Strategy{
          @Override
          public int doOperation(int num1, int num2) {
              return num1 + num2;
          }
      }
      
      package org.hdq.strategy;
      
      /**
       * @className: MultiplyOperation
       * @description: 相乘 操作
       * @author: huangdq
       * @date: 2023/01/29 10:18
       **/
      public class MultiplyOperation implements Strategy{
          @Override
          public int doOperation(int num1, int num2) {
              return num1 * num2;
          }
      }
      
      package org.hdq.strategy;
      
      /**
       * @className: SubtractOperation
       * @description: 相减 操作类
       * @author: huangdq
       * @date: 2023/01/29 10:16
       **/
      public class SubtractOperation implements Strategy{
          @Override
          public int doOperation(int num1, int num2) {
              return num1 - num2;
          }
      }
      
    • 创建使用策略类

      package org.hdq.strategy;
      
      /**
       * @className: Context
       * @description: 执行行为变化
       * @author: huangdq
       * @date: 2023/01/29 10:20
       **/
      public class Context {
      
          private Strategy strategy;
      
          public Context(Strategy strategy){
              this.strategy = strategy;
          }
      
          public int executeStrategy(int num1, int num2){
              return strategy.doOperation(num1, num2);
          }
      }
      
      
    • 实现

      package org.hdq.strategy;
      
      /**
       * @className: StrategyPatternDemo
       * @description: 测试类
       * @author: huangdq
       * @date: 2023/01/29 10:23
       **/
      public class StrategyPatternDemo {
      
          public static void main(String[] args) {
              Context context = new Context(new AddOperation());
              System.out.println(context.executeStrategy(10 , 22));
      
              context = new Context(new SubtractOperation());
              System.out.println(context.executeStrategy(23, 11));
          }
      
      }
      
  3. 总结

    • 优点
      • 多种行为(算法)可以自由切换
      • 避免使用多重条件判断
      • 扩展性良好
    • 缺点
      • 随着业务,策略类会逐渐变多,增加维护开销。
      • 所有策略类都需要对外暴露
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值