随笔分类 - 设计模式
摘要:编写优秀代码的一个要素就是避免冗余,在面向对象编程中方法和函数是我们用来避免编写冗余代码的重要工具 模板设计模式旨在消除代码重复。 横幅生成器: 将一段文本发送给一个函数,该函数要生成一个包含该文本的横幅。横幅有很多种。但有一个默认,也能够使用我们提供的风格 from cowpy import cow # 生成艺术字符 def dots_style(msg): ...
阅读全文
posted @ 2018-12-18 13:57
慕沁
摘要:状态模式 面向对象编程着力于在对象交互时改变他们的状态。 状态模式关注的是实现一个状态机,状态的核心部分是状态和状态之间的转换。每个部分具体如何实现并不重要 from state_machine import State, Event, acts_as_state_machine, after, before, InvalidStateTransition @acts_as_stat...
阅读全文
posted @ 2018-12-18 13:13
慕沁
摘要:观察者模式 描述单个对象与一个或多个对象之间的发布-订阅关系。 当一个对象的状态改变时更新另外一组对象 例子:数据格式化程序 class Publisher: def __init__(self): self.observers = [] def add(self, observer): if observer not in ...
阅读全文
posted @ 2018-12-18 11:46
慕沁
摘要:如何在应用中实现撤销功能。 推荐哪个设计模式来实现撤销,那就是命令模式 命令模式帮助我们讲一个操作(撤销、重复、复制、粘贴)封装成一个对象。 我们并不需要直接执行一个命令,命令可以按照希望执行 调用命令的对象与指导如何执行命令的对象解耦。调用者无需知道命令的任何实现细节 如果有意义,可以把多个命令组织起来,这样调用者能够按顺序执行他们。例如,在实现一个多层撤销命令时,...
阅读全文
摘要:责任链模式用于让多个对象来处理单个请求对象时,或者用于预先不知道应该由哪个对象来处理某个特定请求时。 其原则如下所示。 1、存在一个对象链 2、我们一开始将请求发送给链中的第一个对象 3、对象决定是否要处理该请求 4、对象将请求转发给下一个对象 5、重复该过程,直到到达链尾 好处:可以解耦发送方和接收方 例子,自动售货机:当钞票放入后,会被...
阅读全文
posted @ 2018-12-18 09:34
慕沁
摘要:为其他对象提供一种代理以控制对这个对象的访问。简单的说就是自己不想去干的事情交给代理去干 代理类型: 其中虚拟代理非常有用 # _resource变量时机不是在t创建时初始化的,而是在我们首次使用t.resource时 # 第二次使用t.rescourse时,并没有再次初始化变量。
阅读全文
posted @ 2018-12-17 15:50
慕沁
摘要:由于对象创建的开销,面向对象的系统可能还面临性能问题,性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑。大型复杂系统中也可能会出现同样问题,因为要在其中创建大量对象,这些对象需要同时并存。 eg:如果一个3D地带的每个对象都是单独创建,未使用数据共享,那么性能将是无法接受的。 若想要
阅读全文
posted @ 2018-12-17 14:49
慕沁
摘要:外观模式 # 如何创建单个入口来隐藏系统复杂性系统会随着演化变得非常复杂,最终形成大量的类和交互,这种情况并不复杂。许多情况下,我们并不想把这种复杂性暴露给客户端。外观设计模式有助于隐藏系统的内部复杂性,并通过一个简化的接口向客户端暴露必要的部分。本质上外观是在已有复杂系统之上实现的一个抽象层 # coding: utf-8 from enum import Enum fr...
阅读全文
posted @ 2018-12-17 13:47
慕沁
摘要:我们想为一个对象添加额外的功能,可选方法: 如果合理,可以直接将功能添加到对象所属的类 使用组合 使用继承 与继承相比,通常优先选择组合,因为继承式地代码更难复用,继承关系是静态的并且应用与整个类以及这个类的所有实例。 修饰器动态地扩展一个对象的功能;能以透明的方式动态地将功能添加到一个对象中 dj
阅读全文
posted @ 2018-12-17 13:03
慕沁
摘要:不要求访问他方的源代码 不违反开放\封闭原则 通常两个不兼容接口中的一个是他方的或者是老旧的。 如果是他方的,就意味着我们无法访问其源代码,如果是老旧的,那么对其重构通常是不切实际的。更进一步,我们可以说修改一个老旧组件的实现以满足我们的需求,不仅不切实际,而且违反了开放、封闭原则。 开放/封闭原则
阅读全文
posted @ 2018-12-17 12:49
慕沁
摘要:可视化工具套件(Visualization Toolkit)以及music21是原型模式的应用s。 (⊙o⊙)…额,东西好少。 总结:
阅读全文
posted @ 2018-12-17 10:26
慕沁
摘要:可以用于细粒度控制复杂对象的创建过程 建造者模式与工厂模式的区别: 建造者模式: 要创建一个复杂对象(该对象由多个部分构成,切对象的创建要经过多个不同的步骤,这些步骤也许还需要遵从特定的顺序) 要求一个对象能有不同的表现,并希望将对象的构造与表现解耦 想要在某个时间点创建对象,但在稍后的时间点在访问
阅读全文
posted @ 2018-12-16 12:23
慕沁
摘要:工厂的两种形式: 想要追踪对象的创建时 想要将对象的创建与使用解耦时 想要优化应用的性能和资源占用时 1、工厂方法 2、抽象工厂
阅读全文
posted @ 2018-12-16 11:37
慕沁
摘要:存在的意义:放到同一个地,方便所有人共同操作 , 使用函数装饰器实现单例 使用类装饰器实现单例 使用__new__关键字实现单例 使用metaclass实现单例 # 函数装饰器 # 类装饰器 # new metaclass关键字 简单说:元类(metaclass)通过__metaclass__方法创
阅读全文
posted @ 2018-12-16 10:08
慕沁