面向对象编程----6大设计原则
一、单一职责原则(SRP)
一个类,只有一个引起它变化的原因。SRP中,把职责定义为“变化的原因”。多个职责耦合在一起,会影响复用性。
接口一定要做到单一职责,类的设计要尽量做到只有一个原因引起变化。
二、里氏替换原则(LSP)
所有引用父类的地方必须能透明地使用其子类对象。
只要父类能出现的地方,子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就能适应。
三、依赖倒置原则(DIP)
依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此的独立,不互相影响,实现模块间的松耦合。
高层模块不应该是依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节。细节应该依赖抽象。
对象依赖关系有三种方式传递:
(1)构造函数传递依赖对象。 (2)Setter方法传递依赖对象。 (3)接口声明依赖对象。
四、接口隔离原则(ISP)
使用多个专门的接口比使用单一的总接口要好。在不违反单一原则的前提下,尽量使用多个专门的接口代替单一的接口。
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
但另一方面,接口越多系统将会越复杂,在实际的开发中这并不是一件好事。所以需要点经验把握住这个“度”。
五、迪米特法则(LOD)
又叫最少知识原则(LKP),就是说一个对象应该对其它对象尽可能少的了解。也即是平常所说的“不要和陌生说说话”。
其中门面模式和调停者模式实际上就是迪米特法则的应用(有空再去详细了解下)。
迪米特法则要求系统的局部设计简化,每一个局部都不会和远距离的对象有直接的关联。但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。
迪米特法则在类的设计上的体现:
(1)优先考虑将一个类设置成不变类。
(2)尽量降低一个类的访问权限。
(3)谨慎使用Serializable。
(4)尽量降低成员的访问权限。
六、开闭原则(OCP)
软件实体应当对扩展开放,对修改关闭。软件系统中包含的各种组件(模块、类、方法)应该在不修改现有代码的基本上引入新的功能。
开闭原则包括两方法意思:
"开" : 对于组件功能的扩展是开放的,是允许对其进行功能扩展的。
"闭" : 对于原有代码的修改是封闭的,即不应该修改原有的代码。
实现开闭原则的关键就在于“抽象”。作为一个系统的抽象层,要预见所有可能的扩展,从而使增加任何扩展时,系统抽象底层不需要修改。