2.7万 Star!最全面的 Python 设计模式集合

【导语】:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易地被他人理解、保证代码可靠性。python-patterns 则是使用 python 实现设计模式的集合。

简介

学会了很多门编程语言,就是一个好程序员了吗?事实上,入门很简单,但真正的精通不仅需要会写出简单的类似“Hello World”的程序,还需要熟练应用,并解决各种问题。在精通的道路上,设计模式是我们一定会接触并需要掌握的一个知识。

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,这些解决方案是众多软件开发人员经过相当长的一段时间和错误总结出来的,它是软件工程的基石,如同大厦的一块块砖石一样。

目前市面上,我们买到的设计模式的书,基本是用 Java 语言实现的,对于Python 语言的用户不是很友好,而python-patterns恰好填补了这个空白。

这个开源项目的地址是:https://github.com/faif/python-patterns

怪兽试用了自己经常用的策略设计模式,repo 里的代码很简洁,稍微改改就可以应用到自己的项目里,十分好用。

支持的设计模式

创建型模式

  • 抽象工厂模式(abstract_factory)

  • 单例模式(brog)

  • 建造者模式(builder)

  • 工厂模式(factory)

  • 惰性评价模式(lazy_evaluation)

  • 对象池模式(pool)

  • 原型模式(prototype)

结构型模式

  • 3层模式(3-tier)
  • 适配器模式(adapter)
  • 桥接模式(bridge)
  • 组合模式(composite)
  • 装饰器模式(decorator)
  • 外观模式(facade)
  • 享元模式(flyweight)
  • 前端控制器模式(front_controller)
  • MVC模式(mvc)
  • 代理模式(proxy)

行为型模式

  • 责任链模式(chain_of_responsibility)
  • 目录模式(catelog)
  • 方法链模式(chaining_method)
  • 命令模式(command)
  • 迭代器模式(iterator)
  • 中介者模式(mediator)
  • 备忘录模式(memento)
  • 观察者模式(observer)
  • 发布订阅模式(publish_subscribe)
  • 注册模式(registry)
  • 规格模式(specification)
  • 状态模式(state)
  • 策略模式(strategy)
  • 模板模式(template)
  • 访问者模式(visitor)

可测试型模式

  • 依赖注入模式(dependency_injection)

基础模式

  • 委托模式(delegation_pattern)

其他模式

  • 黑板模式(blackboard)
  • 图搜索模式(graph_search)
  • hsm模式(hsm)

策略模式举例

在这里怪兽试用了python-patterns里的策略模式示例。

策略模式定义了一组算法,将每个算法都封装起来,并使他们之间可以互相替换。策略模式使得每个算法和调用他们的实体彼此独立,减少了代码的冗余。一般当算法策略需要经常被替换时,可以考虑策略模式。比如下面在电商场景里会经常碰到的订单价格计算的例子,计算价格时会用到满减、打折、优惠券等方式。

class Order:
    def __init__(self, price, discount_strategy=None):
        self.price = price
        self.discount_strategy = discount_strategy

def price_after_discount(self):
        if self.discount_strategy:
            discount = self.discount_strategy(self)
        else:
            discount = 0
        return self.price - discount

def __repr__(self):
        fmt = '<Price: {}, price after discount: {}>'
        return fmt.format(self.price, self.price_after_discount())

def ten_percent_discount(order):
    return order.price * 0.10

def on_sale_discount(order):
    return order.price * 0.25 + 20

在使用策略模式后,可按如下方式,在计算订单价格时,动态的选择需要使用的价格计算策略。

def main():    '''    >>> Order(100)    <Price: 100, price after discount: 100>    >>> Order(100, discount_strategy=ten_percent_discount)    <Price: 100, price after discount: 90.0>    >>> Order(1000, discount_strategy=on_sale_discount)    <Price: 1000, price after discount: 730.0>    '''

if __name__ == '__main__':    import doctest    doctest.testmod()

其他设计模式内容,请参见:

https://github.com/faif/python-patterns

- EOF -

(0)

相关推荐

  • 一日一技:在 Python 中编写抽象类

    摄影:产品经理 游玩:产品经理&kingname 在极客时间某设计模式相关的课程中,某老师说 Python 不支持抽象类和接口. 但实际上,Python 支持抽象类. Python 自带的ab ...

  • TypeScript实现设计模式——策略模式

    策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. --<大话设计模式> 策略模式主要用来解决当有多种相似算 ...

  • 聊聊 Python 面试最常被问到的几种设计模式(下)

    聊聊 Python 面试最常被问到的几种设计模式(下)

  • python中的other.a怎么理解?

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/python中的other.a怎么理解? 作者:融水公子 rsgz Python3 教程 Python3 教程 http://www.rsgz.t ...

  • 感觉自己的代码很乱?因为你不懂套路

    编程教室开了这么久,已经有很多人从完全零基础的小白成为了会写代码的菜鸟程序员,能够自己独立开发程序.不过到此阶段,常常会遇到瓶颈,感觉功能可以实现,但代码看起来有些别扭: 代码中有很多相似的重复代码 ...

  • PyPattyrn-一个简单而有效的python库,用于实现常见的设计模式

    PyPattyrn是一个python软件包,旨在使您更轻松,更快地将设计模式实现到您自己的项目中. 设计模式本质上不能直接转换为代码,因为它们只是对如何解决特定问题的描述.但是,许多常见的设计模式都具 ...

  • 设计模式——把类作为参数的抽象工厂模式

    今天给大家介绍一个非常简单的设计模式,一学就会,非常好用. 这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑.主要的用途一般是将一些复杂的类的创建过程整合在一起 ...

  • 怎么样让你写的程序分工又分家?

    导语:这次是开发者蓝图系列的第二篇,让我们好好聊聊工厂方法模式的前世今生. 之前猿哥就说了,设计模式是源于万千程序猿的真实项目的开发经验,并超脱这些经验,给出的解决方案. 工厂方法模式当然也不例外,它 ...

  • 好书甄选 | 70+移动应用UI设计模式《UI Patterns for Mobile Applications》

    用户体验设计大师Theresa Neil将向你介绍包括反模式在内的10种不同类型的设计模式.无论你正在设计一款简单的iPhone应用,还是开发适用于当前市场上所有流行移动操作系统的应用,这些设计模式都 ...

  • python---策略模式

    目录 python–策略模式 前言 一. 应用 二. 避免过多使用if-else 三. 使用策略,工厂模式. python–策略模式 前言 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的 ...

  • Python单例模式(Singleton)的N种实现

    很多初学者喜欢用全局变量,因为这比函数的参数传来传去更容易让人理解.确实在很多场景下用全局变量很方便.不过如果代码规模增大,并且有多个文件的时候,全局变量就会变得比较混乱.你可能不知道在哪个文件中定义 ...

  • Python中的单例模式有几种实现方式?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • 流畅的python学习笔记(三):把函数视作对象(2:使用一等函数实现设计模式 )

    流畅的python学习笔记(三):把函数视作对象(2:使用一等函数实现设计模式 )