大话设计模式总结1----全书概览
题记:如果想成为一名优秀的软件设计师,了解优秀软件设计的演变过程比学习优秀设计本身更加有价值,因为设计的演变过程蕴藏着大智慧。如果你想成为拥有大智慧的软件设计师,那你必须的学习设计模式。
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
一、设计模式的引子
武功套路是习武的门径。新手要一招一式地练习套路,烂熟于心之后,熟能生巧,在实战之中即可见招拆招、运用自如——此时习武之人已从“新手”成长为“好手”。“高手”则没有套路,实战之中只有自然反应,然而一招一式浑然天成、恰到好处,似有似无、无中生有。“高手”之上还有“高高手”,他们达到的境界非我等凭借金氏武侠小说可以揣测。
设计模式之于设计,好比套路之于武术。“新手”要一个接一个地学习模式,“好手”能够活用模式,“高手”则没有模式。
设计模式的“内功”是面向对象的基本原则。这些原则是“神”,模式是“形”。高手拼的是“内功”,对面向对象基本原则有了深刻的领悟,才能用好设计模式,避免“走火入魔”。
一般在设计模式著作的前几章都会介绍面向对象的基本原则,这几章非常重要(例如:大话设计模式)。学通了这几章,后面的模式就不过如此了。学完了设计模式,也最好翻过头来重新看看这几章,保证会有新的领悟。
二、为什么使用设计模式
对任何设计都可以凭主观(对设计很难做出客观评价)判断得出它是一个好的设计,还是一个坏的设计。使用设计模式是为了避免坏的设计。程杰在他的著作《大话设计模式》中描述了优秀的杰作,使用设计模式原则,下面先简单的介绍一下(后面会相关博课详细介绍):
①单一职原则:就一个类而言,应该仅有一个引起它变化的原则。
②开放—封闭原则:对于扩展是开放的,对于更改是封闭的
③里氏代换原则:子类型必须能够替换掉它们的父类型。
④依赖倒转原则:针对接口编程,不要对实现编程
⑤迪米特法则:也叫最少知识原则,强调了类之间的松耦合。
⑥合成/聚合复用原则:在一个新的对象里面使用一些已有的对戏那个,使之成为新对象的一部分,新的对象通过向这些对的委派达到复用已有功能的目的。尽量使用合成/聚合,尽量不要使用继承。
设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。
三、指导设计模式的三个重要概念:
(1)重用(reuse):是目标
两种重要的重用手段:Inheritance 和 composition
(2)接口与现实分离
接口保持不变,分离带来灵活性。
多态性(polymorphism)
(3)Decouple(解耦)
降低复杂性。
四、使用设计模式的目的
使用设计模式的目的是为了适应未来的变化,变化之所以存在是因为它的不可预知性——如果可以预知,则不能称其为变化。如何判断哪些需求可能变化,哪些需求可能不变,并且在最大程度上保持设计的干净、简单,这是些工艺问题,而不是工程问题。既然是工艺问题,那么就只能给出原则,不能给出标准。使用设计模式的大体原则可能是:对未来极有可能发生变化的问题给出最简单、修改成本最低的解。
五、避免过度使用设计模式
易维护的程序首先要易理解,这一点远甚于其他。在易理解的代码上才好维护。过分地使用设计模式会增加程序的复杂性和晦涩性,让程序不易理解,从而降低了程序的易维护性。
Switch语句曾经遭致诟病,许多重构的例子就是拿Switch开刀。我认为Switch语句是高效的语句,可以写出极优雅、简单的代码。在很多情况下,直接使用Switch语句比把它拆成若干个Class更“干净”。
再比如,有一段四百多行的代码负责整个系统的调度,如果未来的变化仅仅是修改这四百行代码而不会大量添加代码,那么把这四百多行代码集中在一个函数里面,比将它拆分成十来个Class更加容易维护。
六、大话设计模式中提到的基本的设计模式(注:在此简单介绍,后面会有详文予以解答)
1.创建型模式
社会化的分工越来越细,自然在软件设计方面也是如此,因此对象的创建和对象的使用分开也就成为了必然趋势。因为对象的创建会消耗系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。这里有6个具体的创建型模式可供研究,它们分别是:
简单工厂模式(SimpleFactory);
工厂方法模式(FactoryMethod);
抽象工厂模式(AbstractFactory);
创建者模式(Builder);
原型模式(Prototype);
单例模式(Singleton)。
在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低,这里有7个具体的结构型模式可供研究,它们分别是:
外观模式(Facade);
适配器模式(Adapter);
代理模式(Proxy);
装饰模式(Decorator);
桥模式(Bridge);
组合模式(Composite);
享元模式(Flyweight)。
在对象的结构和对象的创建问题都解决了之后,就剩下对象的行为问题了,如果对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协作效率就会提高,这里有11个具体的行为型模式可供研究,它们分别是:
模板方法模式(TemplateMethod);
观察者模式(Observer);
状态模式(State);
策略模式(Strategy);
职责链模式(Chain ofResponsibility);
命令模式(Command);
访问者模式(Visitor);
调停者模式(Mediator);
备忘录模式(Memento);
迭代器模式(Iterator);
解释器模式(Interpreter)。