策略模式详解

这篇具有很好参考价值的文章主要介绍了策略模式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

策略模式(Strategy Design Pattern),定义一堆算法类,并将每个算法分别封装起来,让它们可以互相替换,被封装起来的算法具有独立性外部不可改变其特性。

策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。

策略模式的应用场景

策略模式最常见的应用场景是,利用它来避免冗长的 if-else 或 switch 分支判断。不过,它的作用还不止如此。它也可以像模板模式那样,提供框架的扩展点等等。

当我们需要多个功能相似的类,并且需要它们之间可以灵活切换时,就非常适合使用策略模式。

策略模式的构成

策略类的定义比较简单,需要定义以下两种角色:

  1. 抽象策略接口类:定义了策略类需要实现的方法规范。
  2. 策略实现类:继承自抽象策略接口,为具体策略类。

当有多个策略时,可以通过简单工厂封装所有的策略,使调用更加易用:

  1. 策略工厂类:一般来说,通过一个策略工厂,将一群功能相同的策略封装起来,调用更加方便。

通过一个文件处理的例子来说明;有一个文件处理的通用类,可以处理excel、txt、exe文件。
面对不同类型的文件,返回具体对应的文件处理类,也就是具体的策略类。

抽象策略接口类

class FileStrategy:
    @abstractmethod
    def read(self):
        pass

抽象策略接口,定义了每个具体的策略类需要实现的方法,符合基于抽象而非实现编程。

策略实现类

class ExeFileStrategy(FileStrategy):

    def read(self):
        print("--- 进行 exe 文件的读取 ---")


class ExeclFileStrategy(FileStrategy):

    def read(self):
        print("--- 进行 excel 文件的读取 ---")


class TxtFileStrategy(FileStrategy):

    def read(self):
        print("--- 进行 txt 文件的读取 ---")

上面分别实现三个不同的具体策略类来处理 exe/excel/txt 文件的读取,每个具体的策略类,要在read方法中实现自己的读取逻辑。

策略工厂类

根据策略类是否有状态,可以分为两种策略的工厂生成方式。

# 策略类无状态时,每次返回同一个策略类,主要提供逻辑的计算。
class FileStrategyFactory:
    MAP = {
        "exe": ExeFileStrategy(),
        "execl": ExeclFileStrategy(),
        "txt": TxtFileStrategy(),
    }

    def create(self, key):
        return self.MAP[key]


# 策略类有状态时,每次返回独立的策略对象,策略对象之间独立。
class FileStrategyFactory1:
    MAP = {
        "exe": ExeFileStrategy,
        "execl": ExeclFileStrategy,
        "txt": TxtFileStrategy,
    }

    def create(self, key):
        return self.MAP[key]()

上面我们实现了两种策略工厂,并且都是使用简单工厂方法,FileStrategyFactory是无状态的,每次相同的key,返回的是同一个策略对象;FileStrategyFactory1是有状态的,每次返回策略对象之间独立。

具体使用

# 无状态策略类
fac = FileStrategyFactory()
exe = fac.create("exe")
exe1 = fac.create("exe")
execl = fac.create("execl")
print(exe is exe1)  # True,每次返回同一个对象
exe.read()
execl.read()

# 有状态策略类
fac = FileStrategyFactory1()
exe = fac.create("exe")
exe1 = fac.create("exe")
execl = fac.create("execl")
print(exe is exe1)  # False,每次返回的对象不同
exe.read()
execl.read()

替代if / else

策略模式,是如何解决冗长的if / else 逻辑,以及解耦不同的策略的呢?

假设我们没有策略类,上面的文件处理类例子,我们大概会写成这样:

if file_type == "exe":
    print("--- 进行 exe 文件的读取 ---")
elif file_type == "execl":
    print("--- 进行 execl 文件的读取 ---")
elif file_type == "txt":
    print("--- 进行 txt 文件的读取 ---")

这样每个if / else 分支,都会耦合在一起,并且如果以后需求变更,需要不断新增文件类型的读取,就会导致分支逻辑越来越长。

而策略模式,通过拆分成不同的策略类,并且通过一个map做成映射,就将不同的策略解耦开来,并且消除了冗长的 if/else 代码。

优缺点

优点

  1. 扩展性好,可以灵活增减策略类。
  2. 基于抽象编程,策略类之间可以自由替换而不用大动代码。
  3. 减少了大量的 if/else 逻辑判断。

缺点文章来源地址https://www.toymoban.com/news/detail-716289.html

  1. 每个策略类需要单独编写,会导致类很多。
  2. 封装多层,代码变得复杂,可读性变差。

到了这里,关于策略模式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式——策略

    前言 策略模式是平时Java开发中常用的一种,虽然已有很多讲解设计模式的文章,但是这里还是写篇文章来从自己理解的角度讲解一下。 我们不妨进行场景假设,要对我们的软件进行授权管理:在启动我们的软件之前先要校验是否存在合法的授权,如果授权不合法则要求用户

    2024年02月20日
    浏览(46)
  • 95 | Python 设计模式 —— 策略模式

    策略模式是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装在独立的策略类中,使得这些算法可以相互替换,而不影响客户端的使用。策略模式可以让客户端根据不同的需求选择不同的算法,从而使得系统更加灵活和可扩展。 在本教程中,我们将学习策略模

    2024年02月13日
    浏览(31)
  • 【python设计模式】13、策略模式

    哲学思想: 策略模式是一种设计模式,它可以使得我们在程序中根据需要动态地选择算法的具体实现方式。策略模式的思想源于哲学中的“多元论”(pluralism)和“实用主义”(pragmatism)。 多元论认为,世界上存在着许多不同的观点和方法,没有一个固定的标准或者方法是

    2023年04月08日
    浏览(43)
  • Java设计模式之策略(Strategy)模式

    策略(Strategy)设计模式定义了一系列算法,将它们封装起来,并且可以相互替换使用,从而使得算法可以独立于使用它的客户而变化。 策略(Strategy)设计模式是一种行为型设计模式,它允许在运行时动态地选择算法。策略模式将算法封装为算法族,从而可以在运行时根据

    2024年02月15日
    浏览(50)
  • Java设计模式-策略模式-基于Spring实现

    策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它将算法封装在 独立的策略类 中,使得它们可以相互替换,而不影响客户端代码。这种模式通过 将算法的选择从客户端代码中分离出来 ,提供了更大的灵活性和可维护性。 在Java中,策略模式的设计理念可以

    2024年02月08日
    浏览(59)
  • Java设计模式—策略模式(Strategy Mode)

    目录 前言 一、策略模式的简介 二、策略模式的概念 三、策略模式的作用 四、策略模式的优、缺点 策略模式的优点: 策略模式的缺点: 五、策略模式应用场景 六、代码案例 1)抽象接口类 2)具体的策略类:减 3)具体策略类:打折 4)上下文类 5)客户端Main代码测试 总结

    2024年02月08日
    浏览(46)
  • Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

            在平时的开发中,涉及到设计模式的有两块内容,第一个是我们 平时使用的框架 (比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。         面试官一般比较关心的是你在开发过程中, 有没有使用过设计模式,或者你在简历上写了关于设计

    2024年02月10日
    浏览(56)
  • 【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    有各种鸭子,比如野鸭、北京鸭、水鸭等。 鸭子有各种行为,比如走路、叫、飞行等。不同鸭子的行为可能略有不同。要求显示鸭子的信息 不同的鸭子继承一个父类Duck,如果是相同的行为就继承,不同行为就重写方法 实现 【鸭子抽象类】 【野鸭】 【北京鸭】 【玩具鸭】

    2024年02月12日
    浏览(60)
  • 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    代理模式(Proxy Pattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源

    2023年04月25日
    浏览(89)
  • 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 如果你需要复制一些对

    2023年04月24日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包