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

yizhihongxing

详解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日

相关文章

  • Python3实现将一维数组按标准长度分隔为二维数组

    针对这个问题,我将为您提供一个标准的Markdown格式文本,包括三个部分:概述、实现步骤和示例说明。 概述 将一维数组按标准长度分隔为二维数组是一道非常基础的Python3问题,它需要我们掌握列表的基本使用方法和切片的操作技巧。在Python3中,要将一维数组转化为二维数组,最常见的方法就是通过切片来实现,将一堆连续的元素挑选出来,依次放到二维数组中。下面…

    python 2023年6月5日
    00
  • 2019年Python趋势解析!(程序员转型需知)

    2019年Python趋势解析 Python作为一门高级、通用、解释型编程语言, 近年来越来越受到程序员和企业的青睐。本文将分析2019年Python的主要趋势。 Python在程序员领域的应用 Python在程序员领域的应用越来越广泛,从web开发到数据科学,从人工智能到自动化测试。其中最流行的方向是数据科学和人工智能。下面将对这两个领域进行详细介绍。 数…

    python 2023年5月20日
    00
  • 利用Python发送 10 万个 http 请求

    以下是Python发送10万个http请求的攻略,具体分为以下几个步骤: 1. 安装必要的库 使用Python发送http请求需要用到requests库,可通过以下命令安装: pip install requests 2. 编写发送请求的Python脚本 按照以下格式编写Python脚本: import requests # 设置要发送请求的url url …

    python 2023年5月19日
    00
  • Python操作XML文件的使用指南

    在Python中,可以使用内置库xml.etree.ElementTree来操作XML文件。本攻略将提供两个示例,演示如何使用xml.etree.ElementTree库来读取和写入XML文件。 示例一:读取XML文件 以下是一个示例,演示如何使用xml.etree.ElementTree库读取XML文件: import xml.etree.ElementT…

    python 2023年5月15日
    00
  • 基于Python中random.sample()的替代方案

    基于Python中random.sample()函数的替代方案有很多,下面将针对其中两种进行详细介绍。 方案一:使用numpy.random.choice() numpy.random.choice()函数是numpy库中的随机抽样函数,可以方便地替代random.sample()函数。其用法如下: numpy.random.choice(a, size=N…

    python 2023年6月3日
    00
  • Python实现自动化域名批量解析分享

    Python实现自动化域名批量解析是一种非常有用的技能,可以帮助我们在日常工作中进行批量处理和自动化操作。下面详细介绍如何实现这一技能: 1. 前提条件 在开始实现自动化域名批量解析之前,需要准备以下工具和环境: Python环境,建议使用Python 3.x版本 带有域名列表的文本文件 2. 实现步骤 2.1 安装依赖库 首先需要安装 dnspython …

    python 2023年6月5日
    00
  • python中response.text 和response.content的区别详解

    在Python中,我们可以使用requests库发送HTTP请求,并使用response对象获取HTTP响应的内容。其中,response.text和response.content是两个常用的属性,用于获取HTTP响应的文本和二进制数据。本文将详细讲解response.text和response.content的区别,并提供两个示例。 response.t…

    python 2023年5月15日
    00
  • python的rllib库你了解吗

    当谈到控制理论或者强化学习算法时,Python语言的RLLib(Library for Reinforcement Learning) 库是一个有价值的库之一。RLLib库在强化学习领域中提供了可集成的途径,以训练端到端的强化学习智能体,并将其应用于真实世界的问题中。 下面是一个使用RLLib库训练一个小车教授自己在一个轨道上行驶的示例。 第一步是安装RLL…

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