在讲述设计模式的原则之前,我们必须要了解面向对象的几个基本目标。

面向对象,将世界归纳为一句话:万事万物皆对象。

在没有面向对象之前,软件的可维护性是相当的烂,主要原因有四个:

l 过于僵硬

l 过于脆弱

l 复用率低

l 黏度过高

在软件设计过程当中无论那种设计思维都把可拓展性、灵活性、可插入性作为软件设计的一个基本的指导思想。

设计模式的研究当中一个非常重要的概念就是:复用,那么什么是复用呢?软件的复用又有那些好处呢?复用又有那些基本的形式呢?复用和可拓展性、灵活性、可插入性又有那些关联或者关系呢?

首先,复用就是重复使用的意思。软件复用带来了几个比较明显的好处:1,较高的生产率,2较高的软件质量,3恰当的使用复用可以改善软件的系统的可维护性。

一个可复用的软件可以为将来的软件开发节省开发使用的时间和费用,一个越频繁使用的构件那么以后开发投资就相对越少。如果一个软件的复用路越高,那么发现它存在的缺陷就更快,从而也可以更为彻底的排除这种缺陷,这样很明显有利于系统的维护。更为重要的一点是,复用与系统的可维护行有着直接的关系。

软件复用包括:代码的复制与粘贴;算法的复用;数据结构的复用,模型复用。

在面向对象的语言当中数据的抽象化和继承的关系使得概念和定义可以复用;多态性使得实现和应用可以复用。而抽象化和封装可以保证和促进系统的可维护性。面向对象的复用的焦点不是函数不是算法等细节,而是体现在宏观意义上的商业逻辑的抽象的层次上,而这些是提高复用性和保证提高可维护性的关键所在。
在面向对象的设计当中,抽象的层次应该是相对稳定的部分,也是复用的焦点,抽象模块相对于具体的模块独立,从而具体模块的内部结构的变化就不会影响到抽象层次的结构,因而抽象层次的模型复用就会较为容易。

在面向对象的领域里边,可维护性复用是以设计原则和设计模式为基础的。

系统的可拓展性由:开闭原则,里氏代换原则,依赖倒转原则和组合/聚合复用原则所保证。

系统的灵活性由:开闭原则、迪米特法则、接口隔离原则所保证

系统的可插入性由:开闭原则、里氏代换原则,组合/聚合复用原则以及依赖倒转原则所保证。

开闭原则

开闭原则的核心我们总结为:对拓展开放,对修改关闭。

说的直白点就是:在模块不被修改的的前提下可以被拓展。

优点:

l 通过拓展,可以提供新的行为,以满足新的需求,使其具有一定的灵活性和适应性。

l 对已有模块,特别是最为重要的抽象模块不能再被修改,使得变化中的软件有一定的稳定性和延续性。

在开闭原则当中最为关键的就是:抽象化。从另外一个角度讲就是所谓的“对可变性的封装原则”。这样就意味着有两点:

1、 可变性不应该散落到代码的角落,而应该白封装到对象里。继承不应当被看作是封装变化的方法,而应该被认为是从一般的对象生成特殊对象的方法。

2、 一种可变性,不应当与另一种可变性混合(设计模式的类图和继承结构一般都不会超过两层)。

里氏代换原则是继承和复用的一个基石。

里氏代换原则

里氏代换原则:任何基类可以出现的地方,子类一定可以出现。

这个是对开闭原则的一个补充。开闭原则的关键是抽象化,里氏代换原则则是对实现抽象化具体步骤的规范化。

依赖倒转原则

核心是:依赖于抽象,而不依赖于具体的实现。开闭原则是目标,依赖倒转原则是一种手段。违反了依赖倒转原则就不可能达到开闭原则的要求。

合成/聚合复用原则

核心:尽量合成/聚合,而不是使用继承关系达到复用的目的。合成/聚合复用原则和里氏代换原则相辅相成,前者要求设计师首先考虑合成和聚合关系,后者则要求在使用继承关系的时候,必须确定这个关系符合这一条件。

依赖也叫耦合,耦合分为三种,零耦合(如果两个类没有耦合关系),具体耦合(发生在两个具体的或者说是可以实例化的类之间,经由一个类对另一个具体类的直接引用造成的),抽象耦合(发生在一个具体的类和一个抽象类或者接口之间的,使两个必须发生关系的类之间存在最大的灵活性)。

抽象不应当依赖与细节,而细节应当依赖于抽象。也就是针对接口编程,而不要针对实现编程。以抽象的方式耦合是依赖倒转原则的关键。里氏代换原则是依赖倒转原则的一个基础。

组合/聚合复用原则

核心:要尽量使用合成聚合,尽量不要使用继承。

聚合用来表示“拥有”关系或者整体与部分的关系。而合成是一种表示强的多的“拥有”关系。上以篇博文中有提及这两者的区别。

迪米特法则

核心:一个软件的实体应当尽可能的减少和其他实体发生相互作用。

迪米特法则所谈论的就是对对象之间的信息量、流线以及信息的影响的控制。在软件系统当中,一个模块设计的好不好的最主要也是最重要的标识就是该模块在多大程度上将自己的内部数据和其他有关的细节隐蔽起来。

l 在类的划分上应当创建有弱耦合的类

l 在类的设计结构上,每一个类都应当尽量降低成员的访问权限,一个类不应当public自己的属性而应该提供取值和赋值的方法。

l 在类的设计上,只要有可能就应当设置成不变类。

l 在对其他类的引用上,一个对象对其他对象的引用应当降到最低。

接口隔离原则

核心:客户端应该尽可能小的单独的接口,而不要提供大的总的接口。

接口隔离原则和广义的迪米特法则都是对一个软件的实体与其他的软件实体的通信的限制。广义的迪米特法要求尽可能的减少通信的宽度和深度,接口隔离原则限制的是通信的宽度。遵循这两个法则会使一个系统软件,在功能拓展的过程当中,不会将修改的压力传递到其他对象。

以上就是设计模式当中应该注意的几个原则,也是指导设计的一个关键性的原则。在设计软件的时候,应该充分的考虑这几个基本原则,同时也要考虑到软件或者其他工具本身,以及软件经济成本和时间成本等因素的一些制约,所以需要综合来考虑分析,用最合适的方式来开发和维护软件,避免成本虚高,设计过度的情形出现,总之,在允许的条件情况下用最合的的设计模式进行软件开发是最值得推荐的。

转自:http://blog.csdn.net/voyage_mh1987/article/details/5735461