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

Wesley13
• 阅读 495

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

简介

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

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

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

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

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

怪兽试用了自己经常用的策略设计模式,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

开源前哨 日常分享热门、有趣和实用的开源项目。参与维护 10万+ Star 的开源技术资源库,包括:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
java24种设计模式
一、设计模式定义  设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。二、设计模式分类  经典模式只有23个(还有简单工厂模式),它们各具特色,每个模式都为某一个可重复的设计问题提供了一套解决方案。  根据它们的用
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
2年前
Java 设计模式(1)
设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种
Wesley13 Wesley13
2年前
Java开发中的23种设计模式详解(转)
设计模式(DesignPatterns)                                 ——可复用面向对象软件的基础设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他
Wesley13 Wesley13
2年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这