【设计模式】何为设计模式

引言


设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。在学习具体模式之前,我想有必要先了解一些概念。

概念


Design Patterns(设计模式)这本书由Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides 合作完成,这四个作者也被称为:Gang of Four (四人组,GoF) 。

OOA&D(Object-oriented analysis and design,面向对象分析和设计)是一种现在流行的技术分析方法,是现代软件企业广为采用的一项有效技术。
面向对象系统的分析和设计实际上追求的两点, 一是高内聚(Cohesion) , 二是低耦合(Coupling) 。 这也是我们软件设计所准求的, 因此无论是 OO (面向对象)中的核心思想:封装、 继承、 多态,还是我们的设计模式的原则和实例都是在为了这两个目标而努力。

有人说“懂了设计模式,你就懂了面向对象分析和设计( OOA/D)的精要。反之好像也可能成立。”

原则


使用设计模式是为了达到了代码复用、增加可维护性的目的,那么设计模式又是如何实现的,这里有几大原则供参考。开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法。

【设计模式】何为设计模式_第1张图片

单一职责( Single responsibility principle SRP):就一个类而言,应该仅有一个引起它变化的原因。

里氏代换( Liskov Substitution Principle LSP):子类型必须能够替换掉它们的父类型。

开放封闭(The Open-Closed Principe,OCP):是说软件实体(类、模块、函数等)应该可以拓展,但不可修改。

依赖倒转( Dependence Inversion Principle,DIP ):A: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;B:抽象不应该依赖细节;细节应该依赖抽象。

接口隔离( Interface Segregation Principle ISP): 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

合成/聚合复用( Composite/Aggregate Reuse Principle,CARP ):经常也叫做合成复用原则, 合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。它的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。

迪米特( Law of Demeter,LoD ):也叫最少知识原则,如果这两个类不必彼此直接通信,那么这两个类就不应当直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

模式


在经典的《设计模式》一书中,作者总共归纳了23种设计模式,其中我们熟悉的简单工厂模式并未在这23种设计模式之中,这里基本上将这23种设计模式分为了三类:创建型、结构型、行为型。


【设计模式】何为设计模式_第2张图片


创建型:社会化的分工越来越细,在软件设计方面也是如此,因此对象的创建和对象的使用分开也就成为了必然趋势。因为对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。

结构型:解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低。

行为型:在对象的结构和对象的创建问题都解决了之后,就剩下对象的行为问题了,如果对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协作效率就会提高。


【设计模式】何为设计模式_第3张图片

设计模式关系图


小结


在学习设计模式的时候看了程杰的《大话设计模式》和K_Eckel的《GoF23种设计模式详解》,K_Eckel讲学习的时候更多是一个迭代的过程,这和我们的学习方法也是一致的。不要指望一遍就可以把设计模式学会,并灵活使用,其他的知识也是一样。

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。这23中设计模式也不是作者凭空创造出来的,是作者在不断的开发,实践中不断总结出来的,学习完设计模式不意味着直接可以设计出一个完美的解决方案,我想更重要的是一个过程,了解软件设计的演变过程。在不断的重构中,让自己的代码更为简洁、具有效率。

以上是对设计模式的一个整体上的总结,在以后的学习、实践中认真体会每一个设计模式的妙处,并及时总结,总结是很好的学习。



你可能感兴趣的:(【设计模式】何为设计模式)