策略模式

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

策略模式(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 索引
如何删除表中的重复记录只保留其中一条?
如何删除表中的重复记录只保留其中一条?
554 0
|
9月前
|
存储 测试技术 C#
DDD领域驱动设计:实践中的聚合
领域驱动设计(DDD)中的聚合根是管理复杂业务逻辑和数据一致性的核心概念。本文通过任务管理系统示例,讲解如何设计聚合根、处理多对多关系、强制业务规则及优化性能,帮助开发者构建结构清晰、可维护的领域模型。
830 12
DDD领域驱动设计:实践中的聚合
|
3月前
|
Python
用Python给PPT“加点戏”:让汇报秒变高光时刻
本文揭秘Python批量添加PPT动画的实战技巧,用`python-pptx`实现淡入、顺序出现等基础效果,借`Spire.Presentation`打造旋转淡出、逐行高亮等高级动画,直击手动调动画耗时、单一、难维护三大痛点,并附避坑指南与可复用模板,助你10分钟搞定专业动态汇报。(239字)
445 2
|
5月前
|
人工智能 自然语言处理 供应链
全面解析 RPA 机器人:核心逻辑、行业场景、实战案例与发展趋势
RPA机器人是企业数字化转型的“隐形助手”,通过模拟人工操作,自动完成重复性工作。它无需改造系统,高效连接各类软件,广泛应用于金融、制造、医疗、政务等领域,大幅提升效率、降低成本、减少差错。随着AI融合,RPA正从“工具”进化为“智能员工”,实现自然语言交互、自主决策。未来,人人可用的“全民自动化”时代即将到来。
1186 2
|
5月前
|
数据采集 前端开发 测试技术
Python网页自动化操作全攻略:从入门到实战
网页自动化可高效替代重复性浏览器操作,广泛应用于数据采集、测试、社交媒体管理等场景。本文详解Selenium、Requests+BeautifulSoup、Playwright三大工具的选型与实战技巧,涵盖元素定位、等待机制、反爬应对、多窗口处理及CI/CD集成,助你构建稳定高效的自动化流程。(238字)
513 0
|
JavaScript 前端开发 测试技术
selenium的底层核心原理
Selenium 是一个强大的Web应用自动化测试工具,通过模拟用户与浏览器的交互来测试Web应用。其核心组件WebDriver支持多种浏览器,通过HTTP请求管理和操作浏览器会话,实现跨浏览器和跨平台的自动化测试。Selenium Grid支持分布式测试,提高测试效率。作为一个开源项目,Selenium不断发展,适应快速变化的Web技术。
|
Arthas 监控 安全
arthas如何跟踪某个方法?并查看方法的入参和出参?
arthas如何跟踪某个方法?并查看方法的入参和出参?
3106 6
|
负载均衡 监控 网络协议
TCP四次挥手:为什么四次?原理大揭密!
**TCP四次挥手详解**:客户端发送FIN进入FIN-WAIT-1,服务器回ACK进CLOSE-WAIT;服务器发送FIN,客户端回ACK进TIME-WAIT,等待2MSL确保数据传输完毕,防止新旧连接混淆。四次挥手确保双方完全关闭连接,解决数据丢失问题。过多TIME-WAIT可通过负载均衡、优化关闭顺序或调整系统参数缓解。关注“软件求生”获取更多技术内容!
489 0
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)

热门文章

最新文章