天天看点

设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结

文章目录

  • 1. 策略模式介绍
    • 1.1 定义
    • 1.2 角色组成
    • 1.3 应用场景
  • 2. 代码演示
    • 2.1 场景介绍
    • 2.2 不使用策略模式
      • 2.2.1 代码
      • 2.2.2 存在的问题
    • 2.3 使用策略模式 + 工厂模式
      • 2.3.1 类图
      • 2.3.2 代码
    • 2.4 策略模式优缺点
  • 3. 总结
  • 3. 总结

1. 策略模式介绍

1.1 定义

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
百度上说: 指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

1.2 角色组成

规则是死的,人是活的,我们应该灵活运用。什么环境角色,无所谓的。
  • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
  • 具体策略角色:包装了相关的算法和行为。
  • 环境角色:持有一个策略类的引用,最终给客户端调用

1.3 应用场景

  • 1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
    • 比如:你支付,你可以用支付宝、微信、qq,那么这个就是 支付策略中的不同的实现方式。
  • 2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
  • 3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

2. 代码演示

2.1 场景介绍

比如我们买东西,有时候会有促销,比如促销策略有:优惠券优惠、返现优惠、或者熟人邀请码优惠(“😂我瞎想的”)

那么这三个统称为促销策略。

2.2 不使用策略模式

2.2.1 代码

假设使用的mvc三层
  • Controller 类
    设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结
  • Service 类
    设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结
  • 调用类
    设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结

2.2.2 存在的问题

  1. 如果又增加了新的条件,那么在service类里面,还是要加 判断,加方法等。提高了复杂度,和维护难度
  2. 看起来也比较臃肿。不美观。哈哈

2.3 使用策略模式 + 工厂模式

2.3.1 类图

设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结

2.3.2 代码

其实最主要的还是这写个策略类,运用多态的原理实现。具体怎么用,可以灵活搭配吧,我个人认为。
  • 策略抽象类
    设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结
  • 促销策略的三个实现类
    设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结
    设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结
  • 获得对应策略的工厂类(解释看代码注释)
设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结
  • Service 类
    设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结
  • 测试类
    设计模式(5) -行为型模式之 - 策略模式1. 策略模式介绍2. 代码演示3. 总结3. 总结

2.4 策略模式优缺点

优点:

1、算法可以自由切换。

2、避免使用多重条件判断。

3、扩展性良好。

缺点:

1、策略类会增多(每一个策略,都需要一个类)。

2、所有策略类都需要对外暴露。

3. 总结

这次总结的不到位,很正常,因为我本身也没有 太理解这个模式。希望在以后的学习中,可以领悟到这个模式的精髓吧。。。。。

1、策略类会增多(每一个策略,都需要一个类)。

2、所有策略类都需要对外暴露。

3. 总结

这次总结的不到位,很正常,因为我本身也没有 太理解这个模式。希望在以后的学习中,可以领悟到这个模式的精髓吧。。。。。