面向对象设计原则

面向对象设计原则

1.何为设计原则

​ 设计原则是写面向对象代码时的指导思想。我们在设计软件时,需求往往是复杂而多变的,为了应对这一点,我们有两大法宝:分解和抽象。分解即把复杂问题分解成若干简单问题,抽象即提取事物的核心特征。面向对象设计原则的核心任务就是抵御变化,将变化点进行封装来减少对代码的修改,来方便人们进行功能的拓展。

2.单一责任原则

​ 单一责任原则是设计原则的核心,它认为:每个类应该只有一个职责。因此也只有一个修改该类的原因。如此一来,我们可以最大程度减少类方法的膨胀,减小修改类内容的可能性。

​ 如:一个日志类应该拥有添加日志记录的功能,而不应该有将日志持久化到磁盘的功能。应该专门设计一个类去执行持久化操作。

3.开放封闭原则

​ 开放封闭原则实质上是对单一责任原则和抽象的运用。它认为:软件实体对拓展开放,对修改封闭。我们可以将某个类的功能进行拆分,将其分为多个部分,提取其核心抽象部分作为抽象基类,当新业务到来,直接继承抽象基类,在新的业务类中实现具体细节即可,此为拓展。

​ 如:要实现一个过滤器,(如通过颜色、大小过滤对象)。可以将其分为两个部分(单一责任原则):过滤器(输入并返回某些对象的过程),规范(用于规定如何过滤数据元素)。如此,当我们需要一个具体的过滤器的时候,就可以继承过滤器抽象基类,再将规范作为参数传递给类方法,我们变可以得到各种过滤器了。

4.里氏替换原则

​ 里氏替换反映了继承必须基于抽象。它认为:如果某个接口以基类Parent类型的对象为参数,那么它应该同等的接受子类对象为参数,并且程序不会产生任何异常。简单来说,子类可以替换它们的基类。

5.接口隔离原则

​ 接口隔离原则也是对单一责任原则的运用。它认为:应该将复杂的接口分离为多个单独的接口,以避免强制实现者必须实现他们实际上并不需要的接口。

​ 如:需要一个抽象打印机基类,有打印、扫描、传真三个接口,但是有时使用者只需要打印功能,他还得把三个接口全实现一遍。如果将打印机基类拆分成打印、扫描、传真三个接口类,再由类组合或继承的方式生成打印机基类,那么就可以根据想要的功能,去实现对应的接口,不需要实现内些不需要的接口。

​ 实际上还是体现了类的单一责任,尽可能缩减类的功能,减少耦合,增加灵活性。

6.依赖倒置(倒转)原则

​ 依赖倒置原则体现了抽象和封装变化思想。它认为:

​ 高层模块(稳定)不应该依赖低层模块,它们都该依赖于抽象(稳定)

​ 抽象(稳定)不应该依赖于实现细节(变化),实现细节(变化)应该依赖于抽象(稳定)

​ 如:有一个打印日志的模块,它应该依赖于日志抽象类(将日志抽象类的引用或指针作为类成员),而不应该依赖于某个具体的日志类。

​ 使用建议:

​ (1)每个类尽量都有接口或抽象类,或者接口和抽象类两者都具备。

​ (2)变量的表面类型尽量是接口或抽象类。

​ (3)任何类都不应该从具体类派生。

​ (4)尽量不要重写基类的方法。如果基类是一个抽象类,而且这个方法已经实现了,子类尽量不要重写。

​ (5)结合里氏替换原则使用。