Statistics
38
Views
0
Downloads
0
Donations
Uploader

高宏飞

Shared on 2025-12-14
Support
Share

Author风往北吹

No description

Tags
No tags
Language: 中文
File Format: PDF
File Size: 1.7 MB
Support Statistics
¥.00 · 0times
Text Preview (First 20 pages)
Registered users can read the full content for free

Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.

(This page has no text content)
《设计模式》学习笔记 by 风往北吹 作者:风往北吹 邮箱:lifeandhome@live.com 封面设计者:风往北吹 产品设计者:风往北吹 出版历史: April 6,2023 First Edition
感谢 谨以此书献给我的家人,父亲、母亲和Internet,是您们的爱和支持伴 随我走过这些岁月 您们给于我生命,您们造就了如今的我。是您们的教育使我不断进 步,是您们开括了我们的视野(世界上拥有各种不同生存方式),是 您们让我们找到了志同到合的伙伴(不管我们的兴趣多么小众),是 您们改变了我们思维方式(从不同方面来看问题),让我们以一种全 新的视角看待问题,重新审视我们的生活方式,更好的思考生活的意 义。您们使我的存在拥有了意义。对您们的感谢我无法用言语表述, 仅以此书,献给您们!您们就是我的生命!
目录 感谢 3 前言Preface iii 一切为了您的阅读的价值 iv 为什么要讲述学习技巧? iv Chapter 1 设计模式 6 第1.1节 设计原则 6 第1.2节 Observer Pattern-观察者模式 7 第1.3节 Decorator Pattern/装饰模式 10 第1.4节 Strategy Pattern/策略模式 10 第1.5节 桥接 11 第1.6节 Factory Method Pattern 11 第1.7节 Abstract Factory Pattern 12 第1.8节 Singleton Pattern/单件模式 12 第1.9节 Command Pattern 13 第1.10节 Adapter Pattern/适配器、代理 13 第1.11节 Facade Pattern/外观模式 15 第1.12节 Template Method Pattern 15 第1.13节 Iterator Pattern/迭代器模式 16 第1.14节 State Pattern/状态模式 17 第1.15节 Composite Pattern 17 第1.16节 Proxy Pattern 18 第1.17节 经典的设计模式MVC 18 第1.18节 原型 21 第1.19节 中介者模式 21 第1.20节 责任链/Chain of Responsibility 23 第1.21节 解释器 24 附录 A 字符索引 26
前言Preface 本书读者 本书面向没有编程经验且希望学习编程的人员。 意见和问题 本书是我自己编写的学习手册,难免出现错误。如果发现错误忽喷。 实在无法忍受书中的错误,请将错误指正并发送给我。因为是业余时 间编写,更新时间可能会很慢。最后,谢谢观看本书。 联系方式: Email:lifeandhome@live.com 如何使用本书 可以根据自己的需要使用本书。本书各章的内容相互独立,不必按顺 序阅读,你完全可以跳过不感兴趣的章节。如果遇到不理解的技术术 语,请参考书后的术语表,或者Google它。 风往北吹 2023年4月4日
一切为了您的阅读的价值 书阅读的最大成本 时间才是读者付出的最大阅读成本。 阅读的时间成本=选择图书所花费的时间+阅读图书所花费的时间+误 读图书所浪费的卖单 阅读的收益 阅读图书最大的收益,来自于获取知识后,应用于自己的工作和生 活,获得品质的改善和提升,视野的开阔,更宽广的心胸,由此,油 然而生一种无限的满足感。 业绩的增长(效率的提高) 花费 一顿饭钱 职位的晋升 几次打车钱 工资的晋级 更好的生活条件 更开阔的视野 更宽广的心胸 为什么要讲述学习技巧? 学习如登山,路很多,但难、易不同。每人体能不同,选择正确的道路才能登顶。 同理,选择适合的、最高效的学习方法至关重要。 学习方法--如何阅读一本书 大脑是我们进行学习器官。我们只有了解了大脑运行原理,在学习时迎合这种原理 进行学习才能更高效。建议读者有时间的话,请阅读《如何阅读一本书》,它会让 提高你的阅读能力。 本书目标人群:没有编程语言背景,想学习编程,将学到的西应用到日常生活当 中。 人脑工作原理:人脑始终在搜索、扫描,寻找发现不同寻常的事物。 比如危险,当这种事件发生,神经系统工作,调动激素,作出应急反 映。比如看到老虎,我们的大脑会告诉我们危险,调动激素,让我们 运动起来逃跑。因此,大脑对图像更敏感,同样大脑对受伤的、痛苦 的、快乐的、丰富的、危险的记忆是记忆的最牢的,多少年过去仍无 法忘记。 如何更好的记忆知识: 阅读前: 1. 明确学习目标、动机,有激情的学习; 2. 拿张白纸; 3. 学习前,在白纸上记下想要了解的问题、想法或过程;
4. 保持在学习前的注意力。 学习中应建立知识的总体框架、相互联系,然后进行细节描述。先整 体,后细节: 1. 保持高度的注意力。 2. 知识面覆盖:对学习的内容有大致印象。看讲座视频为 1.5X或2.X。全看完,不懂的先记下来 。阅读时只偶尔做 笔记,或在每章节后写一段落的总结。1将总结或想法可 视化,图文并茂。 学习完: 1. 使用交谈方式和个人风格描述您想要了解的问题、想 法,如故事模式、问答。用我们自己的话解释它。无法 解释的就是我们要填补的知识缺口。 2. 对付各种过程:了解每一个过程,并弄清楚它是怎么执 行的。将过程可视化,图文并茂。 3. 解决问题,触动情感,作笔记。记忆事情主要依赖于它 的情感内容(高兴的事,惊奇的事)。进行习题练习, 每做完一题,对答案,自我审查。练习,找出什么不 懂,再次翻书回顾就行 重点重温。
Chapter 1 设计模式 设计模式的概念最早起源于建筑设计大师Christopher Alexander关于城 市规划和建筑设计的著作《建筑的永恒方法》,尽管Alexander的著作 是针对建筑领域的,但他的观点实际上适用于所有的工程 设计领域, 其中就包括软件设计领域。在《建筑的永恒方法》一书中,Alexander是 这样描述模式的:模式是一条由三部分组成的规则,它表示了一个特定环境、一个问 题和一个解决方案之间的关系。每一个模式描述了一个在我们周围不断重复发生的问 题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案 而不必做重复劳动。 将设计模式引入软件设计和开发过程的目的在于充分利用已有的软件开发经验,这是 因为设计模式通常是对于某一类软件设计问题的可重用的解决方案。优秀的软件 设 计师都非常清楚,不是所有的问题都需要从头开始解决,他们更愿 意复用以前曾经使用过的解决方案,每当他们找到一个好的解决方 案,他们会一遍又一遍地使用, 这些经验是他们成为专家的部分原 因。设计模式的最终目标就是帮助人们利用熟练的软件设计师的集体经验,来设计 出更加优秀的软件。 在软件设计领域中,每一个设计模式都系统地命名、解释和评价了面 向对象系统中的一个重要的和可复用的设计。这样,我们只要搞清楚 这些设计模式,就可以完全或 者说很大程度上吸收了那些蕴含在模式 中的宝贵经验,从而对软件体系结构有了比较全面的了解。更加重要 的是,这些模式都可以直接用来指导面向对象系统设计中 至关重要的 对象建模问题,实际工作中一旦遇到具有相同背景的场合,只需要简 单地套用这些模式就可以了,从而省去了很多摸索工作。 第1.1节 设计原则 1. 类应对扩展开放,但对修改关闭。 2. 对于相互影响的对象,尽可能使用松散耦合的设计。 3. 找出程序中变化的部分,将它们分离出来。这样你可修改或 扩展此部分,而不会影响其它部分。 4. 使用接口编程,而不是实现。 5. 使用组成而不是继承。 6. 依靠抽象,而不要依赖具体类。 7. 少知道原则---尽可能只使用最友好的、最少的类。 8. 不要叫我,我会叫你。 9. 一个类只有一种责任,即每个类都只有一个责任。 第1.2节 Observer Pattern-观察者模式
定义:The Observer Pattern defines a one-to-many dependency between object so that when one object changes state, all of its dependents are notified and updated automatically. 定义:观察者模式定义了一对多的对象依赖,当对象状态改变,所有 它的依赖者将被通知并且被自动更新。 Figure 1.1 观察 者模式 在Subject中,我们注册Observer对象,也可以删除Observer对象。当 Subject对象状态改变时,则所注册的observers都会调用update()。 Figure 1.2 Observer Pattern的UML图
此实例输出如下: Setting Data 1 = 10 DecimalViewer: Subject Data 1 has data 10 HexViewer: Subject Data 1 has data 0xa Setting Data 2 = 15 HexViewer: Subject Data 2 has data 0xf DecimalViewer: Subject Data 2 has data 15 Setting Data 1 = 3 DecimalViewer: Subject Data 1 has data 3 HexViewer: Subject Data 1 has data 0x3 Setting Data 2 = 5 HexViewer: Subject Data 2 has data 0x5 DecimalViewer: Subject Data 2 has data 5 Detach HexViewer from data1 and data2. Setting Data 1 = 10 DecimalViewer: Subject Data 1 has data 10 Setting Data 2 = 15 DecimalViewer: Subject Data 2 has data 15 实际代码如下: class Subject: def __init__(self): self._observers = [] def attach(self, observer): if not observer in self._observers: self._observers.append(observer) def detach(self, observer): try: self._observers.remove(observer) except ValueError: pass def notify(self, modifier=None): for observer in self._observers: if modifier != observer: observer.update(self) # Example usage class Data(Subject): def __init__(self, name=''): Subject.__init__(self) self.name = name self.data = 0 def setData(self, data): self.data = data
self.notify() def getData(self): return self.data class HexViewer: def update(self, subject): print 'HexViewer: Subject %s has data 0x%x' % (subject.name, subject.getData()) class DecimalViewer: def update(self, subject): print 'DecimalViewer: Subject %s has data %d' % (subject.name, subject.getData()) # Example usage... def main(): data1 = Data('Data 1') data2 = Data('Data 2') view1 = DecimalViewer() view2 = HexViewer() data1.attach(view1) data1.attach(view2) data2.attach(view2) data2.attach(view1) print "Setting Data 1 = 10" data1.setData(10) print "Setting Data 2 = 15" data2.setData(15) print "Setting Data 1 = 3" data1.setData(3) print "Setting Data 2 = 5" data2.setData(5) print "Detach HexViewer from data1 and data2." data1.detach(view2) data2.detach(view2) print "Setting Data 1 = 10" data1.setData(10) print "Setting Data 2 = 15" data2.setData(15) if __name__ == '__main__': main() 第1.3节 Decorator Pattern/装饰模式
定义:动态给对象添加功能。Decorator对于扩展功能,提供了一种替 代子类化的方法,此方法比子类化更灵活。 在这个类图层中,只有一个抽象基类,它定义基本操作。其它类将从 抽象基类继承,并覆盖抽象基类的基本操作。每个子类将重载抽象基 类操作来实现各自特殊的操作。 Figure 1.3 Decorator Pattern类图 第1.4节 Strategy Pattern/策略模式 定义:定义一个算法种类,将此种算法中的每一个算法封装,并使它 们之间可以互相替换。策略模式让算法与使用它的客户互相独立。 第1.5节 桥接
Figure 1.4 Strategy Pattern/策略模式 定义:为了让两者相互独立,我们实现用组合替代继承。让武器成为 角色的组成,剑和刀将会实现武器接口。 Figure 1.5 桥接模 式类图 从实现中抽象并彼此解耦,为了让两者相互独立。 第1.6节 Factory Method Pattern 定义:定义一个创建对象的接口,但由子类来决定对象类型。工厂方 法让子类来进行对象创建。
Figure 1.6 工厂模式 第1.7节 Abstract Factory Pattern 定义:提供一个创建相关或依赖对象集合的接口,而不必指定具体的 类。 Figure 1.7 Abstract Factory Pattern抽像工厂模式 第1.8节 Singleton Pattern/单件模式 定义:确保某类只有唯一一个实例,并提供访问此实例的全局点。
Figure 1.8 Singleton Pattern的UML图 真实世界中,很多事物是唯一的。 第1.9节 Command Pattern 定义:将一个请求封装成对象,这样可以将客户的不同请求、队列或 日志请求参数化, 进行排序、记录,并且支持Undo操作。 Figure 1.9 Command Pattern的UML图 第1.10节 Adapter Pattern/适配器、代理 定义:将某个类的接口转换成客户所需要的接口。Adapter可以使那些 不兼容的接口可以协同工作。
Figure 1.10 工作原理图 Figure 1.11 Adapter Pattern 对象适配器UML图 将这些模式应用到代理服务上,我们可以在中间层按照你的想法来控 制用户访问。 Figure 1.12 Adapter Pattern类适配器UML 图 第1.11节 Facade Pattern/外观模式
定义:给子系统的接口集提供一个统一的接口。Facade定义了一个高级 接口,让子系统更容易使用。 例如:汽车是一个子系统。客户不需要知道汽车的内部结构。 Figure 1.13 Facade Pattern的 UML图 第1.12节 Template Method Pattern 定义:在一个方法中定义算法结构,将某些步骤留在子类来实现。模 板方法模式让子类来定义算法中的某些步骤,来改变算法的功能而不 需改变算法结构。 Figure 1.14 模板方法模式UML图 第1.13节 Iterator Pattern/迭代器模式 程序=数据结构+算法
如何设计数据结构和如何处理数据,实际上很重要,因为它会直接影 响程序的性能。程序使用不同的数据类型来存储数据,由于数据类型 的不同,导致算法的不同。有时,我们需要访问数据而不需要考虑具 体的数据结构,这时你可以使用迭代器模式。 定义:提供一种顺序访问集合元素,并不暴露底层实现的方法。 在这种模式中,通过使用相同接口,我们可以遍历数据而不需要考虑 具体的数据结构。 Figure 1.15 Iterator Pattern的UML图 第1.14节 State Pattern/状态模式 定义:The State Pattern allows an object to alter its behavior when its internal state changes. The object will appear to change its class. 定义:当对象的内部状态改变后,允许对象改变它的行为。好像此对 象所属的类发生的改变。 我们用变换state所指向的对象来改变Context的状态。因为改变了state所 指对象(比如由ConcreteStateA的对象变换成ConcreteStateB的对象), state.handle()返回的结果不同了,对类外的人们来看好像Context的状态 变化了。通过这样来使Context改变状态。
Figure 1.16 状态模式的UML图 第1.15节 Composite Pattern 定义:允许我们将对象组成树结构来表示部分---整体之间层次。 Composite让客户可以将单独对象和对象混合体当成同一种对象处理。 Figure 1.17Composite Pattern 第1.16节 Proxy Pattern 定义:为某一对象提供代理人或持有者,由他控制对对象的访问。
Figure 1.18代理模式类图 第1.17节 经典的设计模式MVC 想你一下你正使用你的手机。 Figure 1.19MVC用例图 MVC模式适用于人机交互环境中,这类环境的最大特点就是用户界面 不断变化。如果用户界面和核心功能紧紧交织在一起,要建立这样一 个灵活的系统通常是非常困 难的,因为很容易产生错误。为了更好地 开发这样的软件系统,系统设计师必须考虑下面两个因素: 用户界面应该是易于改变的,甚至在运行期间也是有可能改 变的。 用户界面的修改或移植不会影响软件的核心功能代码。 解决方案:采用将模型(Model)、视图(View)和控制(Controller) 相分离的思想。在此设计模式中,模型用来封装核心数据和功能,它 独立于特定的输出表示和输入行为,是执行某些任务的代码,至于这
The above is a preview of the first 20 pages. Register to read the complete e-book.