# PyDesignPattern **Repository Path**: won2930015/PyDesignPattern ## Basic Information - **Project Name**: PyDesignPattern - **Description**: 《人人都懂设计模式(Python实现)》书中源代码,搬迁自github - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 6 - **Created**: 2022-01-24 - **Last Updated**: 2024-11-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Description of PyDesignPattern ## English This is the source ocde of [ *Everybody Know Design Patterns : How to comprehend Design Patterns from daily life* ](https://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3). ## 中文 这是《人人都懂设计模式:从生活中领悟设计模式(Python实现)》一书的源码。可通过线上课程[如何从生活中领悟设计模式(Python)](https://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3) 进行试读。 设计模式(Design pattern)是一套被反复使用、多数人知晓的、无数工程师实践的代码设计经验的总结,它是面向对象思想的高度提炼和模板化。使用设计模式将会使你的代码具有更高的可重用性,更好的灵活性和可拓展性,更易被人阅读和理解。 程序不应只是冷冰冰的代码,更应赋予它生活的乐趣和特殊的意义。本课程将会从生活的角度,在生活的每一个细节和故事中解读一个个设计模式。 **力求用最通俗的语言阐述最难懂的概念;用最简单的语法实现最复杂的逻辑;用最短小的代码写出最强悍的程序!** 希望能给您带来一种全新的阅读体验和思考方式。 此升级版的系列分三部分内容:(1). 基础篇,19种常用设计模式单独章节讲解 + 剩余4种模式合集(会有1到2篇的篇幅);(2). 进阶篇,是基础设计模式的衍生,也是各大编程语言中非常重要而常见的种编程机制;(3). 经验篇,将会分享我对设计原则、设计模式、项目重构的经验和看法。 ## 书籍 [京东购买](https://item.jd.com/12580392.html)、[当当购买](http://product.dangdang.com/27848931.html) ![书籍介绍](./docs/EverybodyKnowsDesgnPatterns.jpg) ## 线上课程 ### 引导篇 [设计模式——启程之前,请不要错过我【试读】](http://gitbook.cn/gitchat/column/5a1c24de28554541fbc8f2e8/topic/5a1f8857211fa435d2b9ca6c) ### 基础篇 #### 创建类 [工厂模式——你要拿铁还是摩卡](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/SimpleFactory.py [构建模式(建造者模式)——你想要一辆车还是一座房](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Builder.py [克隆模式(原型模式)——给你一个分身术](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Clone.py [单例模式——你是我生命的唯一](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Singleton.py #### 结构类 [享元模式——颜料很贵必须充分利用](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Flyweight.py [代理模式——帮我拿一下快递](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Proxy.py [装饰模式——你想怎么穿就怎么穿](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Decorator.py advanced_programming/Decorator.py #Python 中的装饰器 [适配模式(适配器模式)——身高不够鞋来凑](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3/topic/5b26052ec81ac568fcf64f20) pattern/Adapter.py [桥接模式] pattern/Bridge.py [外观模式——学妹别慌,学长帮你](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Facade.py file_magic_number.py # 文件魔数读取 #### 行为类 [命令模式——大闸蟹,走起!](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Command.py application/GameCommand.py [访问模式(访问者模式)——一千个读者一千个哈姆雷特](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Visitor.py [职责模式(责任链模式)——我的假条去哪了](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Responsibility.py [备忘模式——好记性不如烂笔头](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Memento.py application/TerminalMonitor.py [中介模式——找房子问中介](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Mediator.py [状态模式——人有少、壮、老, 水之冰、液、汽](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/State.py [模板模式——那些未完待续的设计模式](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Template.py [解释器模式(解释模式)] pattern/Interpreter.py [监听模式(观察者模式)——一坑爹的热水器](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3/topic/5b2604a8c81ac568fcf64ef1) pattern/Observer.py [迭代模式——下一个就是你了](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Iterator.py [策略模式——怎么来不重要,人到就行](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/Strategy.py [组合模式——自己电脑组装,价格再降三折](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) pattern/ComputerComposite.py --- [设计模式——与经典23种设计模式的不解渊源](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) ### 进阶篇 [过滤器模式——制作一杯鲜纯细腻的豆浆](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) advanced_pattern/Filter.py [对象池技术——共享让生活更便捷](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) advanced_pattern/ObjectPool.py [回调机制——把你技能亮出来](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) advanced_pattern/Callback.py [MVC模式] advanced_pattern/MVC.py ### 经验篇 [对设计模式的理解](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) [对设计原则的思考](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) **SOLID 原则** [单一职责原则] principle/SRP.py [开放封闭原则] principle/OCP.py [里氏替换原则] principle/LSP.py [依懒倒置原则] principle/DIP.py [接口隔离原则] principle/ISP.py **实用的设计原则** [LoD 原则( Law of Demeter) P349] - 只和直接(亲近) 的朋友说话,不和陌生人说话。 principle/LoD.py [KISS 原则( Keep It Simple and Stupid)P350] - 保持简单和愚蠢。 [DRY 原则( Don’t Repeat Yourself)P351] - 不要重复自己(不要重复开发同样的功能)。 principle/DIP.py [YAGNI 原则( You Aren't Gonna Need It)P353] - 不要给你的类实现过多的功能,直到你需要它的时候再去实现。 [Rule Of Three 原则 P353] - “三次法则” ,指的是当某个功能第三次出现时, 再进行抽象化,即事不过三,三则重构。 [CQS 原则( Command-Query Separation)] + 命令 | 查询 分离原则 - 命令( Command): 当一个方法要改变对象的状态的时候,它就具有命令的性质。 - 查询( Query): 当一个方法返回一个值来回应一个问题的时候,它就具有查询的性质; + 设计接口时,应该尽量使接口单一化( 单一职责原则),保证方法的行为严格是命令或者查询. - <查询方法>不会改变对象的状态,没有副作用; - 而改变对象状态的<命令方法>不可能有返回值。 [对项目重构的看法](http://gitbook.cn/gitchat/column/5b26040ac81ac568fcf64ea3#catalog) [进行代码重构,常见的原因如下。] 1. 重复的代码太多,没有复用性, 难以维护,需要修改时处处都得改。 2. 代码的结构混乱,注释不清晰, 没有人能清楚地理解这段代码的含义。 3. 程序没有拓展性,遇到新的变化,不能灵活处理。 4. 对象结构强耦合,业务逻辑太复杂,牵一发而动全身,维护时排查问题非常困难。 5. 部分模块性能低,随着用户数量的增长,已无法满足响应速度的要求。 [函数重构] 1. 提炼函数: 对大函数应该拆分成一个个子函数. 2. 去除不必要的参数: 不再需要的参数,果断将该参数去除. 3. 用对象取代参数: 参数众多的函数,应用对象代替参数传入(参数在对象里定义). 4. 查询函数和修改函数分离: 根据CQS 原则将查询函数和修改函数分离. 5. 隐藏函数: 不被其他类使用的类方法,应该声明为 __functionName() . [重新组织数据] 1. 用常量名替换常量值 有一个字面值,带有特别的含义,而且可能在多个地方被用到。 此时可以创建一个常量( 或 枚举变量),并根据其含义为它命名,将具体的字面数值替换为这个常量。这样,既能提高代码 的可读性,又方便修改( 要修改这一字面值时,只要修改常量的定义即可)。 2. 用 Getter 和 Setter 方法代替直接方法 尽量避免直接访问类的成员属性, 可以将类的成员属性声明为 private,然后定义 public 的 Getter 和 Setter 方法来访问这些属性。 3. 用对象取代数组 有一个数组( array),其中的各个元素代表不同的东西,用对象替换数组。对于数组中的每 个元素,以一个值域表示。如电脑的外设[mouse, keyboard, camera],这里的每一个元素都表示 外设,但它们之间的功能和特性差别非常大。因此可以定义一个 ExtensionDevice 类,将 mouse、 keyboard、 camera 定义为这个类的成员。 数据结构的重构和函数的重构都是相对基础的重构方法。有一些代码,类的结构及类之间 的关系本身就不太合理,这时就要用设计模式的思想重新设计这些类之间的关系。这需要我们 有一定的抽象思维,也就是面向对象思想。 大致的思考方向有以下几种。 ( 1) 把具有相似功能的类归纳在一起,并抽象出一个基类,让这些类继承自这个基类( 也 称为父类)。 ( 2) 把子类都使用的方法和属性提炼到父类,并声明为 protected( 部分方法可能要声明为 public)。 ( 3) 不同体系的类之间( 如动物和食物),依赖抽象和接口编程,即依赖倒置原则。 这些方法,需要长期的经验和总结,不能一蹴而就!需要认真学习和领悟设计模式及设计 原则后再使用。