面向对象设计原则

  设计原则是设计模式的理论基础,设计模式就是它们的实践。七大设计原则简单概括以下表所示:程序员

设计原则 归纳 目的
开闭原则 对扩展开放,对修改关闭 下降维护带来的新风险
里氏替换原则 不要破坏继承体系,子类重写方法功能发生改变,不该该影响父类方法的含义 防止继承泛滥
依赖倒置原则 高层不该该依赖低层,要面向接口编程 更利于代码结构的升级扩展
单一职责原则 一个类只干一件事,实现类要单一 便于理解,提升代码的可读性
接口隔离原则 一个接口只干一件事,接口要精简单一 功能解耦,高聚合、低耦合
迪米特原则 不应知道的不要知道,一个类应该保持对其它对象最少的了解,下降耦合度 减小代码臃肿
合成复用原则 尽可能使用组合或者聚合关系实现代码复用,少使用继承 下降代码耦合

一、开闭原则

     原则思想: 软件实体应当对扩展开放,对修改关。
     描述:一个软件产品在生命周期内,都会发生变化,既然变化是一个既定的事实,当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,能够扩展模块的功能,使其知足新的需求。
     优势:提升代码的可复用性,提升软件的可扩展性和可维护性。编程

二、里氏替换原则

     思想: 继承必须确保超类所拥有的性质在子类中仍然成。
     描述:子类能够扩展父类的功能,但不能改变父类原有的功能。子类能够实现父类的抽象方法,但不能覆盖父类的非抽象方法,子类中能够增长本身特有的方法。 反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。
     优势:增长程序的健壮性, 类的扩展不会给已有的系统引入新的错误,下降了代码出错的可能性。设计模式

三、依赖倒置原则

     思想:高层次的模块不该该依赖于低层次的模块,它们都应该依赖于抽象,抽象不该该依赖于具体实现,具体实现应该依赖于抽象。
     描述:
 在软件设计中,细节具备多变性,而抽象层则相对稳定,所以以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定得多。  使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操做,把展示细节的任务交给它们的实现类去完成。依赖倒置原则是实现开闭原则的重要途径之一,它下降了客户与实现模块之间的耦合。
     优势: 下降类间的耦合性; 提升代码的可读性和可维护性; 减小并行开发引发的风险。架构

四、单一职责原则

     思想:一个类(或方法www.jqmms.com)只负责一件事情。 就是控制类的粒度大小、将对象解耦、提升其内聚性。
     描述: 又称单一功能原则,这里的职责是指类变化的缘由,单一职责原则规定一个类应该有且仅有一个引发它变化的缘由,不然类应该被拆分。 若是一个对象承担了太多的职责,至少存在两个缺点:一、一个职责的变化可能会削弱或者抑制这个类实现其余职责的能力;二、当客户端须要该对象的某一个职责时,不得不将其余不须要的职责全都包含进来,从而形成冗余代码或代码的浪费。
    优势:下降类和类的耦合, 下降类的复杂度, 提升可读性,增长可维护性和可拓展性,下降可变性的风险。框架

五、接口隔离原则

     原则思想:类和类之间应该创建在最小接口的上。
     描述:
 要求程序员尽可能将臃肿庞大的接口拆分红更小的和更具体的接口,让接口中只包含客户感兴趣的方法。 要为各个类创建它们须要的专用接口,而不要试图去创建一个很庞大的接口供全部依赖它的类去调用。
     优势:提升程序的灵活度,提升内聚,减小对外交互,使得最小的接口作最多的事情。spa

     注意: 接口的粒度须要合理定义,若是 定义太小,则会形成接口数量过多,使设计复杂化;若是定义太大,灵活性下降,没法提供定制服务,给总体项目带来没法预料的风险。设计

     接口隔离原则和单一职责都是为了提升类的内聚性、下降它们之间的耦合性,体现了封装的思想,但二者是不一样的:3d

        # 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。对象

        # 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序总体框架的构建。继承

 

六、迪米特原则(最少知道)

     原则思想:一个对象应当对其余对象有尽量少地了解,简称类间解耦
     描述:一个类尽可能减小本身对其余对象的依赖,原则是低耦合,高内聚,只有使各个模块之间的耦合尽可能的低,才能提升代码的复用率。
     优势:低耦合,高内聚,提升类的可复用性和系统的可扩展性。

     注意: 过分使用迪米特法则会使系统产生大量的中介类,从而增长系统的复杂性,使模块之间的通讯效率下降。因此,在釆用迪米特法则时须要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。

 

七、合成复用原则

     原则思想:因为合成或聚合能够将已有对象归入到新对象中,使之成为新对象的一部分,所以新对象能够调用已有对象的功能。

     描述: 它要求在软件复用时,要尽可能先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。 通常而言,若是一个角色获得了更多的责任,那么可使用合成/聚合关系将新的责任委派到合适的对象。固然,这种复用也有缺点。最主要的缺点就是经过这种复用建造的系统会有较多的对象须要管理。

     优势: 维持了类的封装性,成分对象的内部细节是新对象看不见的,因此这种复用又称为“黑箱”复用。新旧类之间的耦合度低,这种复用所需的依赖较少,新对象存取成分对象的惟一方法是经过成分对象的接口。复用的灵活性高,这种复用能够在运行时动态进行,新对象能够动态地引用与成分对象类型相同的对象。

总结

    实际上,这些原则的目的只有一个:下降对象之间的耦合,增长程序的可复用性、可扩展性和可维护性。 在实际开发过程当中,并非必定要求全部代码都遵循设计原则,而是要综合考虑人力、时间、成本、质量,不刻意追求完美,要在适当的场景遵循设计原则。这体现的是一种平衡取舍,能够帮助咱们设计出更加优雅的代码结构。