<在Evernote写笔记,直接从Evernote中复制出来,格式有所偏差>
设计模式原本是从面向对象的代码中总结出来的,但是现在的编程语言往往在语法级别就封装了一些常用的设计模式支持。
设计模式和具体编程语言无关,但是设计模式在各个具体语言里面的使用方法不尽相同。
面向对象的软件开发中有很多普遍存在的原则(Principle),在设计以及开发面向对象程序的时候,就应该遵循以下抽象原则:
- 开放-封闭原则(OCP)
- 单一职责原则(SRP)
- Liskov替换原则(LSP)
- 依存关系倒置原则(DIP)
- 接口隔离原则(ISP)
- 迪米特法则(LoD)
- 合成/聚合复用原则(Composite/Aggregate Reuse Principle . CARP)
我们的目标是使代码符合上面的这些原则,这是目的。我们如何达到这个目的呢?那就是使用设计模式,这是手段。目的比手段更抽象,也即原则比设计模式抽象程度更高。
设计模式可以分成3大类:有关生成的模式(5个),有关构造的模式(7个),有关行为的模式(11个)。
1. Singleton 单例模式 (生成)
说明:保证某个类的实例只有一个
为什么:系统全体只需要唯一一个这个对象
如何做:
- 使用库的方法实现
- 使用类或者模块
- 把一般对象作为单例,重写new方法等等手段,这是一般语言常用的方法
总结:反正不管用什么手段,必须只有一个实例!必须的!
2. Proxy 模式 (构造)
说明:为某个对象提供代理对象。 什么意思?
为什么:
- 不想把实现写死,调用程序只和Proxy打交道
- 延迟加载具体程序,先加载Proxy
- 屏蔽具体实现的复杂性,简化调用接口
如何做:
- 库
- 自己写代码(库其实也是别人写的代码)
3. Iterator 模式 (行为)
说明:提供按顺序访问集合对象中各元素的方法,即使不知道对象的内部构造
也可以按顺序访问其中的每个元素。
为什么:为什么?
如何做:
- 类库只带实现,例如java里面的集合类,都是可迭代的,不过调用代码写起来比较拖沓
- 语法自然实现,python里面就自然的实现,例如 for x in XXX.
- 你自己写代码实现
总结:这已经是最基本的东西了,几乎都不算是个模式了。在有闭包的语言ruby,内部迭代器。没有闭包java,外部迭代器。
内部迭代器的缺陷:不能同时进行多个循环,也就无法实现按顺序比较2个集合元素的处理。所以返回外部迭代器也有它的优势!比较优秀的是内外部无缝集成。感觉上Ruby偏向于内部迭代,Python更偏向于语法级别的自然外部迭代。
外部迭代器的缺陷:外部迭代器的缺陷在于迭代器(光标)对象需要参照集合对象的内部信息。为了按顺序访问集合对象的各个元素,迭代器对象需要访问集合的内部构造,这就破坏了隐蔽集合内部构造的封装性原则。
4.Prototype
(单词解释the first example of something, such as a machine or other industrial product, from which all later forms are developed)
说明: 明确一个实例最为要生成对象的种类原型,通过复制该实例来生成新的对象。
静态类型语言往往发挥不出这个模式的作用,在动态类型语言里面才能发挥它的巨大威力。
甚至于 Prototype模式应该称之为编程范式(Paradigm)更合适。
例如大部分编程语言从编程范式上来说都是类模式,但是JavaScript就是一种原型模式,JavaScript不直接定于类,
然后由类来生成对象,而是直接复制对象,然后往对象上添加属性和方法变成新的对象。
为什么:自然而然
如何做:1. 编程范式级别 2.语法级
5. Template Method 模板方法 (为了编写抽象算法的模式)
说明:在父类的一个方法中定义算法的框架,其中几个步骤的具体内容则留给子类来实现。
为什么:1. 可以在不改变算法构造的前提下,在子类中定义算法的一些步骤。
6. Observer 模式 (避免高度依赖)
说明:当某个对象的状态发生变化时,依存于该状态的全部对象都自动(被动)得到通知,而且为了让他们都得到更新,定义了 对象间的一对多的依存关系。这是控制类与类之间依存关系的一种模式。
7. Strategy 模式
说明:定义算法的集合,将各算法封装,使它们能够交换。
分享到:
相关推荐
在标题“松本行弘:Ruby2.0”及描述“松本行弘向大家介绍了如何使用Ruby2.0。”中,我们可以了解到这段演讲或文章主要由Ruby语言的创造者松本行弘(Yukihiro "Matz" Matsumoto)分享关于Ruby 2.0的相关内容。这表明...
松本行弘.pdf》这本书不仅是一本关于编程语言和技术趋势的专业指南,同时也是一次与Ruby之父的思想对话,旨在启发读者思考编程的本质及其在未来世界中的角色。通过对这些核心主题的深入分析,读者可以更好地理解编程...
Ruby之父松本行弘的又一力作。作者对云计算、大数据时代下的各种编程语言以及相关技术进行了剖析,并对编程语言的未来发展趋势做出预测,内容涉及Go、VoltDB、node.js、CoffeeScript、Dart、MongoDB、摩尔定律、编程...
《代码的未来》是Ruby之父松本行弘的又一力作。作者对云计算、大数据时代下的各种编程语言以及相关技术进行了剖析,并对编程语言的未来发展趋势做出预测,内容涉及Go、VoltDB、node.js、CoffeeScript、Dart、MongoDB...
[Ruby编程语言].弗拉纳根_松本行弘.扫描版.part1.rar 共2个文件
[Ruby编程语言].弗拉纳根_松本行弘.扫描版.part1.rar 共2个文件
代码的未来》综述了我当前掌握的 IT 趋势,书中就摩尔定律、编程语言、多核、NoSQL 等在未来几年中将备受关注的领域,介绍了相关的现状和基础识。
Streem 是 Ruby 语言的开发者松本行弘(Matz,全名是Yukihiro Matsumoto)新开发的一种基于流的并发脚本语言,类似于shell,但语法更为丰富,主要受Ruby、Erlang和其他函数式语言的启发。 用Streem可以这么写一个...
它由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)创建于1993年。 您可以在 www.ruby-lang.org 的 Ruby 邮件列表上找到松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)的名字。在 Ruby 社区,松本也被...
Ruby 是一种面向对象的脚本语言,由松本行弘(Yukihiro Matsumoto,通常被称为Matz)于1995年开发。Ruby 以简洁明了的语法和强大的功能而闻名,它被设计为易于编程和易于阅读。 Ruby 是一种面向对象的脚本语言,由...
开发者:松本行弘 开发时间:1995年 设计目的:A PROGRAMMER'S BEST FRIEND【程序员的最佳朋友】 文件扩展名:rb 这个笔记里包含了ruby的整型,字符串,浮点数,布尔等基础数据类型,还有数组,哈希hash的用法, 类...
根据描述,本文讲述的是Ruby语言的发明者松本行弘(Yukihiro "Matz" Matsumoto)与Emacs编辑器的亲身经历。在这一部分,我们可以预见,文章将围绕Emacs对松本行弘个人以及他职业生涯的影响展开。 从提供的部分内容...
《代码的未来》是Ruby之父松本行弘的又一力作。作者对云计算、大数据时代下的各种编程语言以及相关技术进行了剖析,并对编程语言的未来发展趋势做出预测,内容涉及Go、VoltDB、node.js、CoffeeScript、Dart、MongoDB...
——Ruby之父 松本行弘 本书为日本公认的最好的Ruby入门教程。 松本行弘亲自审校并作序推荐。 本书支持最新的Ruby 2.0, 也附带讲解了可运行于1.9版本的代码, 事无巨细且通 俗易懂地讲解了编写程序时所需要的变量...
Ruby语言的创建背景体现了松本行弘对于编程语言设计理念的独特见解。他认为以往编程语言的开发者过于关注“计算机”,而忽视了“人”的因素,过分强调运行速度而忽略了人的使用体验。基于这样的理念,松本行弘希望...
《代码的未来》是Ruby之父松本行弘的又一力作。作者对云计算、大数据时代下的各种编程语言以及相关技术进行了剖析,并对编程语言的未来发展趋势做出预测,内容涉及Go、VoltDB、node.js、CoffeeScript、Dart、MongoDB...
代码的未来》是Ruby之父松本行弘的又一力作。作者对云计算、大数据时代下的各种编程语言以及相关技术进行了剖析,并对编程语言的未来发展趋势做出预测,内容涉及Go、VoltDB、node.js、CoffeeScript、Dart、MongoDB、...