做人有做人的原则,写程序有写程序的原则,设计模式也要遵循原则,目的都是为了达到一种效果,即易维护、易扩展、易复用、灵活性好,下面我们一起走进原则的世界……
【单一职责原则】——拍摄UFO
就一个类而言,应该仅有一个引起它变化的原因。
软件设计真正要做的内容很多,就是发现职责并把这些职责相互分离。明白的说,就是判断各个职责是否应该分离出来,判断的方法:想想还有其他某个动机的变化是否会影响到这个类的变化,如果会那么这个类就不是单一职责,我们就应该想办法把这个类中的每个职责分离开来。从而实现易维护、易扩展、易复用、灵活的作用。
例如:现在我们使用的手机,可谓方便,用一部手机,打电话、发信息、上网聊天、拍照、导航……一切轻松搞定,但是如果从设计模式的角度来看,它是不符合单一职责的,因为功能太过于复杂,这样如果功能太多,难免会有些不周到的地方,比如说拍照的效果自然没有专门的单反效果好,所以我们可以试想一下,如果每种电器只有自己独特的一类单一的功能,那么实现的效果会不会更精呢?当然如果真的把现在的手机拆成很多部分,打电话哪一部分,聊天又是一部分,导航再来一部分,会显得太繁琐,因此就需要具体问题具体分析,生活可以不追求如此单一复杂,但是设计模式中我们需要遵从,因为这样会易维护、易扩展、易复用。
【开放封闭原则】——考研求职两不误
软件实体(类、模块、函数等)应该可以扩展,但是不可修改。对于扩展是开放的,但是对于修改是封闭的。
开放封闭原则是面向对象设计的核心,做好这个原则,就可以达到易维护、易扩展、易复用、灵活性好的效果。开发人员应该仅对程序中呈现出频繁变化的部分作出抽象,并不是每个部分都要抽象。
当然这里说的封闭并不是绝对的,用户的需求是不断变化的,我们希望的是在原有的版本之上优化出新的系统。
例如:计算器 加减乘除的算法
【依赖倒转原则】
高层模块不应该依赖低层模块,两个都应该依赖抽象。
抽象不应该依赖细节,细节应该依赖抽象。
依赖转换可以说是面向对象设计的标志,用那种语言来编程不重要,需要依赖抽象类或者接口。
【里氏代换原则】
子类型必须能够替换掉他们的父类型。
就是说软件如果使用的是一个父类的话,那么一定要适用于子类,而子类也察觉不出父类对象和子类对象的区别,子类也必须拥有一切父类中非private的行为和属性。
例如:企鹅可以继承鸟这个类吗?答案是:不能。因为鸟会飞,但是企鹅不会飞,这么说企鹅有实现不了的鸟的特性,所以不能继承。
【迪米特法则】——无熟人难办事
迪米特法则也叫最少知识原则,如果两个类不必彼此直接通信,那么两个类就不应当直接发生相互作用。如果一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。即强调类之间的松耦合,每一个类应当尽量降低成员的访问权限。
【合成-聚合复用原则】
尽量使用合成\聚合原则,尽量不用使用类继承。
合成和聚合都是关联的特殊种类,聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分;合成则是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。
好处
优先使用对象的合成、聚合将有助于你的保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。