策略模式

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

策略模式(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. 总结
    策略模式是一种非常实用的设计模式,通过将算法封装起来,实现了算法的动态选择和灵活替换。它可以有效地降低代码的耦合性,提高系统的可维护性和可扩展性。在实际开发中,策略模式常用于各种需要动态选择行为的场景,例如支付方式、排序算法等。合理使用策略模式,可以显著提升代码的可读性和可复用性。
相关文章
|
2月前
|
SQL Java 关系型数据库
MyBatis 动态 SQL 详解:灵活构建复杂查询条件
MyBatis提供强大的动态SQL机制,通过`<if>`、`<where>`、`<foreach>`等标签实现条件判断、循环拼接,避免手动字符串处理。支持智能WHERE、SET生成,兼容多数据库模糊查询,提升代码安全性与可维护性,适用于复杂查询、批量操作等场景。
|
2月前
|
Web App开发 区块链 C++
为什么网站图标要使用 ICO 格式?
ICO 是专为图标设计的文件格式,支持多尺寸、多色深与透明度,广泛用于网站 favicon。凭借出色的浏览器兼容性、自动识别机制及单文件多尺寸特性,ICO 仍是网页图标首选,推荐结合 PNG、SVG 共同使用以兼顾兼容性与现代体验。(238 字)
|
应用服务中间件 nginx 缓存
一文掌握 Nginx 反向代理:从入门到生产级配置
本文全面解析Nginx反向代理,涵盖基础概念、负载均衡策略、SSL终止、缓存、安全防护及生产级配置,助你从入门到精通,构建高性能、高可用的Web架构。
1096 1
|
7月前
|
Python
Python 办公实战:用 python-docx 自动生成 Word 文档
本文详解如何使用 python-docx 库实现 Word 文档自动化生成,涵盖环境搭建、文档创建、格式设置、表格与图片处理、模板填充、批量生成及性能优化等实战技巧,助你高效完成办公场景中的文档自动化任务。
1926 1
|
Arthas 监控 安全
arthas如何跟踪某个方法?并查看方法的入参和出参?
arthas如何跟踪某个方法?并查看方法的入参和出参?
2709 6
|
Arthas 监控 Java
揭秘Arthas:如何轻松查看入参的命令
【Arthas教程】了解阿里开源的Java诊断工具Arthas,用于实时监控和诊断应用。使用`watch`命令查看方法入参和返回值,如`watch 类全名 方法名 "{params, returnObj}" -x 展开层数`。优势在于实时性、易用性、灵活性和高效性。提升使用效果需熟悉基本及高级命令,并多实践。尝试Arthas,提升Java开发效率!我是木头左,一起学习进步!
揭秘Arthas:如何轻松查看入参的命令
|
缓存 Java Nacos
nacos服务注册问题之容器报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
890 93
|
前端开发
进来!手把手教用css动画写loading效果
进来!手把手教用css动画写loading效果
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
SQL JSON 关系型数据库
SqlAlchemy 2.0 中文文档(二)(5)
SqlAlchemy 2.0 中文文档(二)
345 0