Python 设计模式:策略模式

在软件开发中,设计模式是一种解决特定问题的通用解决方案。策略模式是一种常用的行为型设计模式,它能够定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。

策略模式简介

策略模式的主要目的是将算法族(策略)封装起来,使它们可以互换。这样做的好处是,可以在运行时选择使用哪个算法,而不需要修改使用算法的代码。

策略模式的组成部分

  1. Context(环境类):持有一个策略类的引用。
  2. Strategy(策略类):定义所有支持的算法的公共接口。
  3. ConcreteStrategy(具体策略类):实现Strategy接口,提供具体的算法实现。

代码示例

下面是一个使用Python实现的策略模式示例,其中包含一个排序算法的策略。

from abc import ABC, abstractmethod

# 策略类
class SortStrategy(ABC):
    @abstractmethod
    def sort(self, data):
        pass

# 具体策略类:冒泡排序
class BubbleSortStrategy(SortStrategy):
    def sort(self, data):
        n = len(data)
        for i in range(n):
            for j in range(0, n-i-1):
                if data[j] > data[j+1]:
                    data[j], data[j+1] = data[j+1], data[j]

# 具体策略类:选择排序
class SelectionSortStrategy(SortStrategy):
    def sort(self, data):
        n = len(data)
        for i in range(n):
            min_idx = i
            for j in range(i+1, n):
                if data[min_idx] > data[j]:
                    min_idx = j
            data[i], data[min_idx] = data[min_idx], data[i]

# 环境类
class SortContext:
    def __init__(self, strategy: SortStrategy):
        self.strategy = strategy

    def set_strategy(self, strategy: SortStrategy):
        self.strategy = strategy

    def sort_data(self, data):
        self.strategy.sort(data)

# 使用策略模式
data = [64, 34, 25, 12, 22, 11, 90]
context = SortContext(BubbleSortStrategy())
context.sort_data(data)
print("Sorted data:", data)

context.set_strategy(SelectionSortStrategy())
context.sort_data(data)
print("Sorted data:", data)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.

序列图

以下是策略模式的序列图,展示了环境类和策略类之间的交互。

SelectionSortStrategy BubbleSortStrategy SortStrategy Context SelectionSortStrategy BubbleSortStrategy SortStrategy Context set_strategy(BubbleSortStrategy) sort(data) sort(data) set_strategy(SelectionSortStrategy) sort(data) sort(data)

结论

策略模式是一种非常有用的设计模式,它允许在运行时选择不同的算法,而不需要修改使用算法的代码。通过将算法封装在策略类中,我们可以轻松地替换算法,提高代码的灵活性和可维护性。在实际开发中,策略模式可以应用于多种场景,如排序算法、支付方式选择等。