策略模式

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

策略模式(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. 总结
    策略模式是一种非常实用的设计模式,通过将算法封装起来,实现了算法的动态选择和灵活替换。它可以有效地降低代码的耦合性,提高系统的可维护性和可扩展性。在实际开发中,策略模式常用于各种需要动态选择行为的场景,例如支付方式、排序算法等。合理使用策略模式,可以显著提升代码的可读性和可复用性。
相关文章
|
SQL 索引
如何删除表中的重复记录只保留其中一条?
如何删除表中的重复记录只保留其中一条?
529 0
|
8月前
|
存储 测试技术 C#
DDD领域驱动设计:实践中的聚合
领域驱动设计(DDD)中的聚合根是管理复杂业务逻辑和数据一致性的核心概念。本文通过任务管理系统示例,讲解如何设计聚合根、处理多对多关系、强制业务规则及优化性能,帮助开发者构建结构清晰、可维护的领域模型。
796 12
DDD领域驱动设计:实践中的聚合
|
5月前
|
SQL Java 关系型数据库
MyBatis 动态 SQL 详解:灵活构建复杂查询条件
MyBatis提供强大的动态SQL机制,通过`<if>`、`<where>`、`<foreach>`等标签实现条件判断、循环拼接,避免手动字符串处理。支持智能WHERE、SET生成,兼容多数据库模糊查询,提升代码安全性与可维护性,适用于复杂查询、批量操作等场景。
|
2月前
|
Python
用Python给PPT“加点戏”:让汇报秒变高光时刻
本文揭秘Python批量添加PPT动画的实战技巧,用`python-pptx`实现淡入、顺序出现等基础效果,借`Spire.Presentation`打造旋转淡出、逐行高亮等高级动画,直击手动调动画耗时、单一、难维护三大痛点,并附避坑指南与可复用模板,助你10分钟搞定专业动态汇报。(239字)
328 2
|
4月前
|
人工智能 自然语言处理 供应链
全面解析 RPA 机器人:核心逻辑、行业场景、实战案例与发展趋势
RPA机器人是企业数字化转型的“隐形助手”,通过模拟人工操作,自动完成重复性工作。它无需改造系统,高效连接各类软件,广泛应用于金融、制造、医疗、政务等领域,大幅提升效率、降低成本、减少差错。随着AI融合,RPA正从“工具”进化为“智能员工”,实现自然语言交互、自主决策。未来,人人可用的“全民自动化”时代即将到来。
1052 2
|
5月前
|
Web App开发 区块链 C++
为什么网站图标要使用 ICO 格式?
ICO 是专为图标设计的文件格式,支持多尺寸、多色深与透明度,广泛用于网站 favicon。凭借出色的浏览器兼容性、自动识别机制及单文件多尺寸特性,ICO 仍是网页图标首选,推荐结合 PNG、SVG 共同使用以兼顾兼容性与现代体验。(238 字)
|
应用服务中间件 nginx 缓存
一文掌握 Nginx 反向代理:从入门到生产级配置
本文全面解析Nginx反向代理,涵盖基础概念、负载均衡策略、SSL终止、缓存、安全防护及生产级配置,助你从入门到精通,构建高性能、高可用的Web架构。
1577 1
|
Arthas 监控 安全
arthas如何跟踪某个方法?并查看方法的入参和出参?
arthas如何跟踪某个方法?并查看方法的入参和出参?
2996 6
|
前端开发
进来!手把手教用css动画写loading效果
进来!手把手教用css动画写loading效果
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)