首页 > 后端开发 > Python教程 > 策略设计模式

策略设计模式

Barbara Streisand
发布: 2024-11-27 15:05:12
原创
752 人浏览过

Strategy Design Pattern

策略设计模式是一种行为设计模式,它能够在运行时选择算法的行为

不是在单个类中实现算法的多个变体,它允许您定义一系列算法,将每个算法封装在自己的类中,并使它们可以互换。

策略模式 (UML) 的组成部分:

  1. Context 类:维护对策略对象的引用并通过公共接口与其交互。

    • 示例: User 类与不同的 Quality 和 AdPolicy 策略交互。
  2. 策略接口:为所有具体策略定义通用接口。

    • 示例: 质量和 ADPolicies 是定义行为的抽象接口。
  3. 具体策略:使用特定算法实现策略接口。

    • 示例: FreeUserQuality、PremiumUserQuality、BasicUserQuality、FreeUserAdPolicy 等

何时使用策略模式

当灵活性和可维护性的好处超过管理多个策略类的开销时,请使用策略模式。

  1. 多种算法:

    • 当您需要在单个类中定义算法或行为的多个变体时。
    • 示例:定义不同订阅计划(免费、基本、高级)的视频质量。
  2. 运行时决策:

    • 当类的行为需要根据用户输入或其他运行时条件动态更改时。
    • 示例:在运行时选择压缩算法(ZIP、RAR、7z)。
  3. 避免过多使用 if 或 switch 语句:

    • 用可互换的策略类替换条件逻辑。
    • 示例:没有大量 if-else 块的付款处理(信用卡、PayPal、UPI)。
  4. 变体的封装:

    • 将算法变体封装在单独的类中,以保持上下文类的干净。
    • 示例:日志记录策略(ConsoleLogger、FileLogger、RemoteLogger)。
  5. 开闭原则:

    • 通过添加新策略而不更改现有代码,确保系统对扩展开放,但对修改关闭。
    • 示例:在示例系统中添加新的用户类型 (EnterpriseUserQuality)。

例子:

from abc import ABC, abstractmethod
from enum import Enum

# Enum for User Types
class UserType(Enum):
    FREE = 0
    BASIC = 1
    PREMIUM = 2

# Strategy Interface for Quality
class Quality(ABC):
    @abstractmethod
    def get_quality(self):
        pass

# Strategy Interface for Ad Policy
class AdPolicy(ABC):
    @abstractmethod
    def has_ads(self):
        pass

# Concrete Strategy for Quality
class FreeUserQuality(Quality):
    def get_quality(self):
        return ['SD']

class BasicUserQuality(Quality):
    def get_quality(self):
        return ['SD', 'HD']

class PremiumUserQuality(Quality):
    def get_quality(self):
        return ['SD', 'HD', 'UHD']

# Concrete Strategy for Ad Policy
class FreeUserAdPolicy(AdPolicy):
    def has_ads(self):
        return True

class BasicUserAdPolicy(AdPolicy):
    def has_ads(self):
        return True

class PremiumUserAdPolicy(AdPolicy):
    def has_ads(self):
        return False

# Context Class
class User:
    def __init__(self, user_type: UserType, quality: Quality, ad_policy: AdPolicy):
        self.user_type = user_type
        self.quality = quality
        self.ad_policy = ad_policy

    def get_quality(self):
        return self.quality.get_quality()

    def has_ads(self):
        return self.ad_policy.has_ads()

# Usage
free_user = User(UserType.FREE, FreeUserQuality(), FreeUserAdPolicy())
basic_user = User(UserType.BASIC, BasicUserQuality(), BasicUserAdPolicy())
premium_user = User(UserType.PREMIUM, PremiumUserQuality(), PremiumUserAdPolicy())

print("Free User Quality:", free_user.get_quality())  # ['SD']
print("Free User Ads:", free_user.has_ads())          # True

print("Premium User Quality:", premium_user.get_quality())  # ['SD', 'HD', 'UHD']
print("Premium User Ads:", premium_user.has_ads())          # False
登录后复制

策略模式的优点:

  1. 灵活性:可以在运行时交换算法,而无需更改上下文类。
  2. 可扩展性:无需修改现有代码即可添加新策略。
  3. 可读性和维护:通过将逻辑委托给特定策略类来减少主类中的混乱。
  4. 坚持 SOLID 原则:特别支持开闭原则。

策略模式的缺点:

  1. 增加复杂性:引入额外的类和对象来管理。
  2. 开销:如果策略数量较少或不经常更改,该模式可能会增加不必要的复杂性。

其他示例

  1. 排序算法:动态使用不同的排序策略(例如,快速排序、合并排序、冒泡排序)。
  2. 折扣计算:根据用户类型应用不同的折扣策略(FlatDiscount、PercentageDiscount)。
  3. 身份验证机制:在不同的身份验证方法之间切换(OAuth、JWT、BasicAuth)。

以上是策略设计模式的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板