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里的策略模式示例。

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

1class Order: 2 def __init__(self, price, discount_strategy=None): 3 self.price = price 4 self.discount_strategy = discount_strategy 5 6 def price_after_discount(self): 7 if self.discount_strategy: 8 discount = self.discount_strategy(self) 9 else: 10 discount = 0 11 return self.price - discount 12 13 def __repr__(self): 14 fmt = "<Price: {}, price after discount: {}>" 15 return fmt.format(self.price, self.price_after_discount()) 16 17 18def ten_percent_discount(order): 19 return order.price * 0.10 20 21 22def on_sale_discount(order): 23 return order.price * 0.25 + 20

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

1def main(): 2 """ 3 >>> Order(100) 4 <Price: 100, price after discount: 100> 5 >>> Order(100, discount_strategy=ten_percent_discount) 6 <Price: 100, price after discount: 90.0> 7 >>> Order(1000, discount_strategy=on_sale_discount) 8 <Price: 1000, price after discount: 730.0> 9 """ 10 11if __name__ == "__main__": 12 import doctest 13 doctest.testmod()

其他设计模式内容,请参见: https://github.com/faif/python-patterns

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

java24种设计模式

一、设计模式定义  设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。二、设计模式分类  经典模式只有23个(还有简单工厂模式),它们各具特色,每个模式都为某一个可重复的设计问题提供了一套解决方案。  根据它们的用

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''