设计模式,是在特定条件下,解决某一特定问题的方法或方式,是经过长期的经验积累而来。
给一个正式的定义:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
GoF的“设计模式”是第一次将设计模式提升到理论高度,并将之规范化,书里提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。
长话短说,我们先来看看软件设计方面所追寻的几个基本原则:
1, “开-闭”原则:人们总是希望自己设计的东西具有可扩展性,在软件领域里就是希望不修改源代码的情况下改变模块的行为。简言之:对扩展开放,对修改关闭。“开-闭”原则是最根本的原则,其他原则是实现它的不同路径,是从其他角度对“开-闭”原则的描述。
2, 里氏代换原则:如果有一个基类适用于某一个接口,则其子类必然也适用。这是多态的基础,也是继承复用的基石,子类代替基类对系统没任何影响时,基类才能真正被复用,而子类才能在基类的基础上增加新的行为。
3, 依赖倒转原则:要依赖抽象接口编程,不要依赖具体实现编程。其实就是应当使用抽象接口来进行变量的类型声明、参量的类型声明、方法的返回类型声明,以及数据类型的转换等,而不应当使用具体实现。
4, 接口隔离原则:使用多个专门的接口,比使用单一的总接口要好。从客户类的角度来讲:一个类对另一个类的依赖性应当是建立在最小的接口上的。
5, 单一职责原则:只能让一个类有且仅有一个职责,这也是单一职责原则的命名含义。换句话说,如果一个类需要改变,改变它的理由永远只有一个。如果存在多个改变它的理由,就需要重新设计该类。也就是永远不要让一个类存在多个改变的理由。
6, 合成/聚合复用原则:尽量使用合成/聚合,不要使用继承。
7, 迪米特法则:一个对象应当对其他对象有尽可能少的了解。通俗点就是不要跟陌生人说话。
其实上面的那些原则主要是为了达到以下目的:
1.少写重复代码
2.尽量不修改已经完成的代码
3.如果要增加功能,最好是通过添加新的类,而不是修改现有代码。
4.一定要修改的话,也要容易修改,并且不会或尽量少影响到其他。
5....
设计模式就是教我们如何在前辈们的经验上,写出可以满足上面条件的代码。
现在都是面向对象了,所以主要考虑的都是基于对象的重用。
使用一个对象分为4步:
1.定义这一类对象的通用模版----类(Class)
2.创建/取得一个对象
3.操作这个对象的方法以改变对象状态
4.销毁这个对象。
定义对象的模版时,就要考虑各类对象之间的复杂关系和结构,来描述一些复杂的事务,当然就是结构模式了。
如何创建一个对象自然就是创建模式。
操作对象呢就是行为模式了。
销毁一个对象比较容易,但是会经常忘,小心点就是了,其模式大概不多。很多语言已经内置了垃圾收集器,自动帮我们照料这些琐事。
创建模式比起其他两个稍微简单一点,我们下一节就从创建模式说起。
附录:
设计包的原则:
1. 发布/重用等价原则(REP)我们创建包的目的是为了给别人重用,所以重用的粒度就是发布的粒度。
2. 公共闭合原则(CCP) 因为相同原因而被修改的类应该放入一个包中,对应于“单一责任原则”。
3. 公共重用原则(CRP)应该尽可能地将只被一个客户使用的包与被多个不同客户使用到的包分开。对应于“接口隔离原则”
4. 非循环依赖原则(ADP)不要在包依赖图中出现循环依赖。如a依赖于b, b依赖于c,同时c又依赖于a。
5. 稳定依赖原则(SDP)要依赖于稳定的包,而不要依赖于经常变化的包。对应于“依赖倒置原则”。
6. 稳定抽象原则(SAP)稳定的包应当是抽象的。对应于“依赖倒置原则”。