记得第一次知道设计模式这个词还是听到别人说的--单例模式是设计模式的一种。当时完全不理解设计模式是什么意思,然后在网上一搜就能看到很多相关的文章,看了一些之后还是不太明白,就看过就过了。后来接触一些框架之后,想要深入了解一下时又看到网上说这个框架里面包含了什么什么模式,那个框架里面运用了什么什么模式,顿时觉得设计模式既然在这么多的框架中都有用到,就想着一定要学习一下。既然是学习那么肯定要记录下来,方便随时回顾,因此开启了设计模式的学习之路。
设计模式介绍
从网上了解到最早将模式的思想引入软件工程方法学的是以“四人组(Gang of Four,简称GoF,分别是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides)”自称的四位著名软件工程学者,他们在1994年归纳发表了23种在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟。然后在1995年, GoF将收集和整理好的23种设计模式汇编成Design Patterns: Elements of Reusable Object-Oriented Software【《设计模式:可复用面向对象软件的基础》】一书,书中将23设计模式根据模式目的上的不同分为了三类,如下表:
创建型 | 结构型 | 行为型 |
---|---|---|
Factory Method Abstract Factory Builder Prototype Singleton |
Adapter Bridge Composite Decorator Facade Flyweight Proxy |
Interpreter Template Method Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor |
这本书在介绍每个模式时,通过统一的信息描述结构详细的描述了每个设计模式,具体的信息描述结构包括:模式名和分类、意图、别名、动机、适用性、结构等等,还有其他的描述结构,详细的需要看书了解。总的来说这本书虽然讲解的还是很详细了,但个人觉得还是不太好理解,所以可以推荐《大话设计模式》和《设计模式-刘伟》等书籍,同时也可以学习网上优秀文章,后面的设计模式系列文章也是基于这三方学习来源来学习的。
后面又了解到设计模式
- 可以帮我们改善系统的设计,增强系统的健壮性。
- 它主要来源众多专家的经验和智慧,它们是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将可以让我们避免做一些重复性的工作。
- 同时对于初学者有助于理解面向对象思想,这里为什么要有“接口”?何谓针对抽象编程?为什么要使用继承?如何不修改源代码增加新功能?
设计模式不止以上列举的好处,但是这些好处就也说明的了解它的重要性,同时引起足够的好奇心。要知道一直保持着好奇,是持续学习的源泉。
面向对象设计原则
在学习设计模式之前,为了更好的理解模式中个角色的构成和组成结构还需要了解一下面向对象设计原则,但是需要注意的是这里的原则不是每条都需要严格遵守的,它只是类似于一种编码建议,遵循它可以带来某些好处,但不遵循也许也会给编码带来方便。
1、开闭原则(Open Close Principle)
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversion Principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
5、迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
这六大原则中在网上都有很多很好的具体列子,各大原则的意思及其案例也是很有必要了解,看了之后对这些设计原则会有更好的理解。这篇文章作为设计模式的开篇,只是简单介绍了一下,就没有详细展开介绍了,但真的建议对各大原则有一定理解。
在《大话设计模式》一书中有一句话--代码无错就是优?看了这句话之后,顿时陷入了沉思,同时也是对自己的灵魂拷问,而它的答案也许就是代码重构的开始。