设计模式实战-策略模式(Strategy Pattern)

简介: 0.0 相关源码链接https://github.com/Wasabi1234/design-patterns1 定义也叫做政策模式(Policy Pattern)维基百科对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.

0.0 相关源码链接

https://github.com/Wasabi1234/design-patterns

1 定义


也叫做政策模式(Policy Pattern)

  • 维基百科
    对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.

比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法.

  • 定义
    Define a family of algorithms,encapsulate each one,and make them interchangeable.

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.

运行时(非编译时)改变软件的算法行为

  • 主要思想
    定义一个通用的问题,使用不同的算法来实现,然后将这些算法都封装在一个统一接口的背后.

策略模式的通用类图
策略模式使用的就是面向对象的继承和多态机制

策略模式的三个角色
● Context 封装角色
也叫做上下文角色,起承上启下封装作用;
屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化.

● Strategy抽象策略角色
策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性

● ConcreteStrategy具体策略角色
实现抽象策略中的操作,含有具体的算法

通用源码

  • 抽象策略角色,它是一个非常普通的接口,在我们的项目中就是一个普通得不能再普通的接口了,定义一个或多个具体的算法

2 适用场景

针对一个对象,其行为有些是固定的不变的,有些是容易变化的,针对不同情况有不同的表现形式。那么对于这些容易变化的行为,我们不希望将其实现绑定在对象中,而是希望以动态的形式,针对不同情况产生不同的应对策略。那么这个时候就要用到策略模式了。简言之,策略模式就是为了应对对象中复杂多变的行为而产生的。

  • 系统有很多类,而他们的区别仅仅在于他们的行为不同
  • 一个系统需要动态地在几种算法中选择一种

3 优点

  • 符合开闭原则
  • 避免使用多重条件转移语句
    比如省去大量的 if/else 和 switch 语句,降低代码的耦合
  • 提高算法的保密性和安全性
    只需知道策略的作用,而不关心内部实现

4 缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
  • 产生很多策略类

5 相关设计模式的差异

策略模式和工厂模式

  • 行为型
    接收已经创建好的对象,从而实现不同的行为
  • 创造型
    接收指令,创建出符合要求的具体对象

策略模式和状态模式

  • 若系统中某个类的某个行为存在多种实现方式,客户端需要知道到底使用哪个策略
  • 若系统中某个对象存在多种状态,不同状态下的行为又具有差异性,状态之间会自动转换,客户端不需要关心具体状态

6 实战






image.png
改造后的测试类

可见 if/else 语句过多,采取策略+工厂模式结合

  • 策略工厂
  • 最新测试类
  • 输出结果

7 源码应用解析

JDK中的比较器接口

  • 策略比较器

具体策略
比如Arrays类中的 sort 方法通过传入不同比较接口器的实现达到不同排序策略

JDK中的TreeMap

类似于促销活动中有促销策略对象,在T reeMap 中也有比较器对象

compare 方法进步加工

Spring 中的Resource

不同访问策略

Spring 中bean 的初始化ceInstantiationStrategy

  • 两种 bean 的初始化策略
目录
相关文章
|
9天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
25 1
|
12天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
21 2
|
26天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
43 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
32 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
29 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
64 3
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
32 1
|
2月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第12天】 在软件开发的世界中,设计模式是解决常见问题的最佳实践。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理运用设计模式可以极大地提高代码的可维护性、扩展性和复用性。本文将深入探讨策略模式(Strategy Pattern)的原理、实现方式及其在PHP中的应用。通过具体示例,我们将展示如何利用策略模式来解耦算法与对象,从而让代码更加灵活和易于管理。
19 0
|
2月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 在PHP开发领域,设计模式是提升代码可维护性、扩展性和重用性的关键技术之一。本文聚焦于策略模式这一行为型设计模式,通过理论阐述与实例分析,揭示其在PHP应用程序中优化算法切换和业务逻辑解耦方面的强大效用。不同于常规摘要,本文不直接概述研究方法或结果,而是基于实际开发场景,探讨策略模式的应用价值和实现方式,旨在为PHP开发者提供一种高效应对复杂业务需求变化和技术债务累积问题的策略思维。