六大原则是学习设计模式的一个前提。只有掌握了六大原则以后,设计模式才能很好的去理解和把控。所有的模式都是在这些原则的基础之上发展起来的,有的只涉及一个原则,有的则涉及多个。
一、宏观
二、细节
(1)单一职责原则
定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
优点:
①可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
②提高类的可读性,提高系统的可维护性;
③变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
(2)开放封闭原则
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
优点:开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。
(3)依赖倒转原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
优点:降低类之间的耦合性,提高系统的稳定性,降低修改程序造成的风险。
例如:公司某工程师设计了一款宝马图纸,以后造宝马就按照它来,轮子统一是X型号。然而有一天,一大客户只想要Y型号轮子的宝马,公司表示很无奈,损失严重。如果当时没有规定必须用X型号轮子,只说四个轮子即可(规定了接口),就不会出现今天的问题。
(4)里氏代换原则
定义:子类型必须能够替换掉它们的父类型。
①子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
②子类中可以增加自己特有的方法。
③当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
④当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
优点:在父类关闭的条件下实现了子类扩展。
弊端:比如使用继承会给程序带来侵入性,程序的可移植性降低,增加了对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能会产生故障。
(5)迪米特原法则
定义:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三方转发这个调用。
优点:每个类都减少了不必要的依赖,因此可以降低耦合关系。
弊端:过分的使用迪米特原则,会产生大量这样的中介和传递类,导致系统复杂度变大。
(6)合成/聚合复用原则
定义:尽量使用合成/聚合,尽量不要使用类继承。( 聚合是一种弱关系,体现的是A包含B,B不是A的一部分;组合是一种强关系,体现的是A与B之间的整体-部分关系。)
优点:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
应用: 它要求我们尽量少用继承,防止类的盲目扩大。在“桥接模式”中体现比较深刻。 这其实也体现了单一职责的思想。尽量减少类的功能,降低耦合。
附加:(7)接口隔离原则
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
看下面两张图你就会明白:
(红字为不用的方法)
接口隔离&单一职责:其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。
三、总结
无论什么原则,都离不开抽象、封装、继承、多态。再回想一下前面说的原则:单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;合成/聚合原则告诉我们要尽量使用组合聚合;迪米特法则告诉我们要降低耦合;而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。