策略模式

简介: 策略模式是一种行为型设计模式,将算法封装成独立策略类,实现算法的动态切换与解耦。适用于需在运行时选择不同算法的场景,如排序、支付方式等,提升灵活性与可维护性,降低条件判断复杂度。

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户,从而实现了对算法的动态选择。这种模式非常适合于需要在运行时选择不同算法的场景。

  1. 策略模式的结构
    策略模式通常包含以下几个角色:

上下文(Context):持有一个策略的引用,并且可以使用这个策略来执行某些操作。
策略接口(Strategy):定义所有支持的算法的接口。
具体策略(ConcreteStrategy):实现策略接口,提供具体的算法实现。

  1. 策略模式的 UML 图
    plaintext
    +----------------+
    |    Context     |
    +----------------+
    | - strategy: Strategy |
    | + set_strategy(Strategy) |
    | + execute_strategy()     |
    +----------------+
           |
           |
    
    +-------+-------+
    | |
    +------------------+ +---------------------+
    | Strategy | | ConcreteStrategyA |
    +------------------+ +---------------------+
    | + algorithm() | | + algorithm() |
    +------------------+ +---------------------+
                    |  ConcreteStrategyB  |
                    +---------------------+
                    | + algorithm()       |
                    +---------------------+
    
  2. 策略模式的实现
    以下是一个 Python 中策略模式的简单示例:

3.1 定义策略接口
python
from abc import ABC, abstractmethod

class Strategy(ABC):
@abstractmethod
def execute(self, data):
pass
3.2 实现具体策略
python
class ConcreteStrategyA(Strategy):
def execute(self, data):
return sorted(data)

class ConcreteStrategyB(Strategy):
def execute(self, data):
return sorted(data, reverse=True)
3.3 实现上下文
python
class Context:
def init(self, strategy: Strategy):
self._strategy = strategy

def set_strategy(self, strategy: Strategy):
    self._strategy = strategy

def execute_strategy(self, data):
    return self._strategy.execute(data)

3.4 使用策略模式
python
if name == "main":
data = [5, 3, 6, 2, 8]

# 使用策略A进行排序
context = Context(ConcreteStrategyA())
result_a = context.execute_strategy(data)
print("Sorted in ascending order:", result_a)

# 更改策略为策略B
context.set_strategy(ConcreteStrategyB())
result_b = context.execute_strategy(data)
print("Sorted in descending order:", result_b)
  1. 策略模式的优缺点
    优点
    灵活性:可以在运行时选择不同的算法,增加了系统的灵活性和可扩展性。
    降低耦合:将算法的实现与使用分离,使得代码更加清晰易懂。
    易于维护:新增算法时,只需实现新的策略类,不影响现有代码。
    缺点
    增加类的数量:每个策略需要单独的类,可能导致类的数量增加,增加系统复杂性。
    客户端必须了解所有策略:客户端需要知道可用的策略,以及如何选择合适的策略。
  2. 何时使用策略模式
    当有多个相关的算法或行为时,可以使用策略模式来封装它们。
    当希望在运行时选择某个算法时。
    当存在许多条件语句来选择算法时,策略模式可以替代这些条件语句,使代码更加简洁。
  3. 总结
    策略模式是一种非常实用的设计模式,通过将算法封装起来,实现了算法的动态选择和灵活替换。它可以有效地降低代码的耦合性,提高系统的可维护性和可扩展性。在实际开发中,策略模式常用于各种需要动态选择行为的场景,例如支付方式、排序算法等。合理使用策略模式,可以显著提升代码的可读性和可复用性。
相关文章
|
存储 测试技术 C#
DDD领域驱动设计:实践中的聚合
领域驱动设计(DDD)中的聚合根是管理复杂业务逻辑和数据一致性的核心概念。本文通过任务管理系统示例,讲解如何设计聚合根、处理多对多关系、强制业务规则及优化性能,帮助开发者构建结构清晰、可维护的领域模型。
1023 12
DDD领域驱动设计:实践中的聚合
|
3月前
|
人工智能 安全 API
把RPA流程打包成独立EXE:内网免安装、授权加密、自定义界面全攻略
去年为客户开发电商数据采集RPA,却因内网禁装软件、无法“双击运行”而交付受阻。历经PyInstaller报错、20G大包被拒等坑后,终于找到国产方案:真正一键打包独立EXE,支持自定义界面、设备绑定、时间授权、离线运行、API/钉钉触发及AI自备API,免费可用,安全可控。(239字)
|
7月前
|
Python
用Python给PPT“加点戏”:让汇报秒变高光时刻
本文揭秘Python批量添加PPT动画的实战技巧,用`python-pptx`实现淡入、顺序出现等基础效果,借`Spire.Presentation`打造旋转淡出、逐行高亮等高级动画,直击手动调动画耗时、单一、难维护三大痛点,并附避坑指南与可复用模板,助你10分钟搞定专业动态汇报。(239字)
1069 2
|
9月前
|
数据采集 前端开发 测试技术
Python网页自动化操作全攻略:从入门到实战
网页自动化可高效替代重复性浏览器操作,广泛应用于数据采集、测试、社交媒体管理等场景。本文详解Selenium、Requests+BeautifulSoup、Playwright三大工具的选型与实战技巧,涵盖元素定位、等待机制、反爬应对、多窗口处理及CI/CD集成,助你构建稳定高效的自动化流程。(238字)
843 0
|
Arthas 监控 安全
arthas如何跟踪某个方法?并查看方法的入参和出参?
arthas如何跟踪某个方法?并查看方法的入参和出参?
3351 6
|
数据可视化 JavaScript 前端开发
低代码可视化工具--vue条件判断v-if可视化设置-代码生成器
低代码可视化工具--vue条件判断v-if可视化设置-代码生成器
449 2
|
负载均衡 监控 网络协议
TCP四次挥手:为什么四次?原理大揭密!
**TCP四次挥手详解**:客户端发送FIN进入FIN-WAIT-1,服务器回ACK进CLOSE-WAIT;服务器发送FIN,客户端回ACK进TIME-WAIT,等待2MSL确保数据传输完毕,防止新旧连接混淆。四次挥手确保双方完全关闭连接,解决数据丢失问题。过多TIME-WAIT可通过负载均衡、优化关闭顺序或调整系统参数缓解。关注“软件求生”获取更多技术内容!
599 0
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
前端开发
进来!手把手教用css动画写loading效果
进来!手把手教用css动画写loading效果
|
Arthas 监控 Java
揭秘Arthas:如何轻松查看入参的命令
【Arthas教程】了解阿里开源的Java诊断工具Arthas,用于实时监控和诊断应用。使用`watch`命令查看方法入参和返回值,如`watch 类全名 方法名 "{params, returnObj}" -x 展开层数`。优势在于实时性、易用性、灵活性和高效性。提升使用效果需熟悉基本及高级命令,并多实践。尝试Arthas,提升Java开发效率!我是木头左,一起学习进步!
揭秘Arthas:如何轻松查看入参的命令

热门文章

最新文章