详解Python设计模式之策略模式

详解Python设计模式之策略模式

策略模式是什么

策略模式(Strategy Pattern)是一种行为模式,用于以相同的方式处理多个不同的行为。在策略模式中,算法被封装在独立的策略中,这使得它们易于替换、理解和扩展。此模式通过定义算法族、分别封装它们,使它们之间可以互换,此模式让算法的变化独立于使用算法的客户。

以计算器为例,有加法、减法、乘法、除法等操作。我们可以使用策略模式将每个操作的具体实现封装在各自的策略中,然后在计算器中使用相应的策略,这样就能够实现相同的接口对多个操作进行处理。

实现策略模式的步骤

1. 定义策略接口

首先,我们需要定义一个策略接口,该接口里面包含具体操作的抽象方法。

from abc import ABC, abstractmethod

class Strategy(ABC):
    @abstractmethod
    def operate(self, num1, num2):
        pass

2. 实现策略类

接下来,我们需要实现具体的策略类,该类需要继承策略接口,并实现对应的操作方法。

class Add(Strategy):
    def operate(self, num1, num2):
        return num1 + num2

class Subtract(Strategy):
    def operate(self, num1, num2):
        return num1 - num2

class Multiply(Strategy):
    def operate(self, num1, num2):
        return num1 * num2

class Divide(Strategy):
    def operate(self, num1, num2):
        return num1 / num2 if num2 != 0 else "Cannot divide by zero"

3. 实现上下文类

接下来,我们需要实现上下文类,该类负责使用相应的策略处理数据。

class Calculator:
    def __init__(self, strategy):
        self.strategy = strategy

    def execute(self, num1, num2):
        return self.strategy.operate(num1, num2)

4. 使用策略模式

最后,我们需要在客户端代码中使用策略模式。

if __name__ == '__main__':
    num1 = 10
    num2 = 5

    add = Add()
    calculator = Calculator(add)
    print(calculator.execute(num1, num2))

    subtract = Subtract()
    calculator = Calculator(subtract)
    print(calculator.execute(num1, num2))

    multiply = Multiply()
    calculator = Calculator(multiply)
    print(calculator.execute(num1, num2))

    divide = Divide()
    calculator = Calculator(divide)
    print(calculator.execute(num1, num2))

通过上述代码,我们可以将加法、减法、乘法、除法操作的具体实现封装在各自的策略类中,然后在上下文类 Calculator 中使用相应的策略处理数据。

示例说明

以下代码为将不同的排序算法封装在各自的策略类中,然后在上下文类中使用相应的策略进行排序。

定义策略接口

from abc import ABC, abstractmethod

class Strategy(ABC):
    @abstractmethod
    def sort(self, data):
        pass

实现策略类

class BubbleSort(Strategy):
    def sort(self, data):
        n = len(data)

        for i in range(n):
            for j in range(n - i - 1):
                if data[j] > data[j + 1]:
                    data[j], data[j + 1] = data[j + 1], data[j]

        return data

class SelectionSort(Strategy):
    def sort(self, data):
        n = len(data)

        for i in range(n):
            min_index = i
            for j in range(i + 1, n):
                if data[j] < data[min_index]:
                    min_index = j

            data[i], data[min_index] = data[min_index], data[i]

        return data

实现上下文类

class SortingClient:
    def __init__(self, strategy):
        self.strategy = strategy

    def execute(self, data):
        return self.strategy.sort(data)

使用策略模式

if __name__ == '__main__':
    data = [5, 3, 8, 4, 2, 1]

    bubble_sort = BubbleSort()
    sorting_client = SortingClient(bubble_sort)
    print(sorting_client.execute(data))

    selection_sort = SelectionSort()
    sorting_client = SortingClient(selection_sort)
    print(sorting_client.execute(data))

通过上述代码,我们可以将冒泡排序和选择排序的具体实现封装在各自的策略类中,然后在上下文类 SortingClient 中使用相应的策略进行排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python设计模式之策略模式 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python利用prettytable实现格式化输出内容

    当我们需要向终端输出一些数据时,通常使用Python内置的print()函数。但是当数据量很大时,输出的数据可能会显得杂乱无章,不便于阅读和理解。这时我们可以使用prettytable库来对输出内容进行格式化处理,以便更好地展示数据。 1. prettytable库的安装 在命令行中输入以下命令即可安装prettytable库: pip install pr…

    python 2023年6月5日
    00
  • 详解Python 中列表推导和 Lambda 的区别

    列表推导和Lambda是Python语言里常用的两个特性,虽然它们用途不同,但是在某些场景下可以替换彼此。下面详细讲解Python 中列表推导和 Lambda 的区别。 列表推导 Python中的列表推导,是一种从一个可迭代对象(iterable)构建另一种可迭代对象的方式。在Python2中,它叫做列表解析(List Comprehensions),在Py…

    python-answer 2023年3月25日
    00
  • Python线程threading模块用法详解

    Python线程threading模块用法详解 Python线程是为了实现多任务而提出来的一种技术。在Python中,线程是通过threading模块来实现的。本文将详细介绍threading模块的用法,包括线程的创建、启动、停止等所有相关知识。 线程的创建 在使用threading模块创建线程时,可以有两种方式: 1. 通过继承Thread类 import…

    python 2023年5月13日
    00
  • Python实现批量下载文件

    下面是 Python 实现批量下载文件的完整攻略。 确定下载链接 首先,需要确定你要下载的文件的链接。如果链接是可迭代的,那么你可以利用 Python 的循环来批量下载这些文件。比如,以下代码实现了下载多个网页上的图片: import requests url_list = [‘http://www.example.com/img/img1.jpg’, ‘h…

    python 2023年6月3日
    00
  • Python OpenCV高斯金字塔与拉普拉斯金字塔的实现

    Python OpenCV高斯金字塔与拉普拉斯金字塔的实现 前言 本文将介绍 Python OpenCV 中高斯金字塔和拉普拉斯金字塔的实现方法。高斯金字塔和拉普拉斯金字塔是图像处理中的经典算法,通常用于缩放、图像增强以及细节增强等应用场合。本文将从原理、代码实现等方面进行介绍。 高斯金字塔 高斯金字塔是一类离散均值滤波的变换,通常用于图像缩放等应用场合。高…

    python 2023年5月18日
    00
  • 如何在Python中插入Redis数据库中的数据?

    以下是在Python中插入Redis数据库中的数据的完整使用攻略。 使用Redis数据库的前提条件 在使用Python连接Redis数据库之前,需要确保已经安装Redis数据库,并已经启动Redis服务器,需要安装Python的Redis驱动redis-py。 步骤1:导入模块 在Python中使用redis模块连接Redis数据库。以下是导入redis模块…

    python 2023年5月12日
    00
  • Django笔记三十四之分页操作

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十四之分页操作 这一篇笔记介绍一下如何在 Django 使用分页。 Django 自带一个分页的模块: from django.core.paginator import Paginator 主要用途是列表数据的切割,比如说有 3000 条用户数据,前端需要一个列表接口用于展示这些数据,但是一次…

    python 2023年4月30日
    00
  • python中end=” “的含义及说明

    当在Python中使用print语句时,我们可以使用end参数来指定输出结束时要添加的字符(默认为换行符\n)。 在默认情况下,当我们使用print语句输出多个变量时,Python会自动用空格分隔它们: name = "Alice" age = 24 print(name, age) # 输出 Alice 24 反之,我们也可以通过设置e…

    python 2023年6月13日
    00
合作推广
合作推广
分享本页
返回顶部