面向对象设计原则

在面向对象程序开发的过程中 , 通过前人的各种总结, 产生了许多的设计原则, 遵从这些设计原则 , 可以有效的减少错误, 提升软件的结构水平

总共有7大原则, 先简短介绍, 如下图

单一职责

      对于单一职责原则,可以理解为一个类只负责一个功能领域中的相应职责, 即一个类不要负责太多“杂乱”的工作。在软件系统中,如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时设计或遭受到意想不到的破坏。以项目开发为例,如果项目组成员每个人的职责都很明确,可以专心开发自己负责的模块,则项目成果的质量往往很高。相反,如果职责不清晰,分工就会混乱。

      优点: 低耦合,高内聚

        单一职责也是最简单的设计原则 , 简单一句话就是, 自己干自己的事, 只需要将自己的那部分职责做好就行了,  例如我们在写项目时, 设计一个广告类(只负责关于广告方面的事)

开闭原则

       开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。

       开闭原则即对扩展开放,对修改封闭。在软件系统开发过程中,软件的需求往往会随着时间的推移而发生变化。因此,进行软件设计时需要考虑怎样的设计才能面对需求的改变却可以相对保持稳定,从而使得系统可以在第一个版本以后不断推出新的版本。这时便可以以开闭原则作为指导。如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行扩展,而且在扩展时无须修改现有代码,使得软件系统在拥有适应性和灵活性的同时具备较好的稳定性和延续性。

         为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。 在进行软件设计时,一般先评估出最有可能发生变化的类,然后构造抽象来隔离那些变化。当变化发生时,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。

       优点 : 适应性和灵活性 , 稳定性和延续性 , 可复用性与可维护性

        开闭原则指使我们对扩展开放, 修改封闭, 可想而知, 开发一个项目, 代码量是庞大的, 如果我们每次添加新功能都去修改源代码的话 , 那么这是非常复杂的 , 但是如果我们能在源代码中提前定义好功能, 等到需要了再去实现它(也就是提供接口,抽象化), 那么这样后期维护,添加新功能等就会方便不少, 所以开闭原则是很重要的设计原则

里氏替换原则

       里氏代换原则是实现开闭原则的重要方式之一。

       在任何父类出现的地方都可以用它的子类来替换,且不影响功能(多态)。

       只有当子类可以替换其父类,软件单位的功能不受影响时,父类才能被真正复用,而子类也能够在父类的基础上增加新的行为。同时,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

在使用里氏代换原则时需要注意如下问题:
        (1) 子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。
        (2) 在运用里氏代换原则时,尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,从而可以很方便地扩展系统的功能。

       里氏替换原则也是实现开闭原则的一种方式, 我们一般将父类或者顶层类设计为抽象类或接口, 它的子类去实现相应的功能 , 这样做可以用子类在具体的实现中直接替代父类, 更好的扩展功能

依赖倒置

      高展模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节; 细节应该依赖抽象。

      也就是针对抽象层编程,面向接口编程。

         也就是说, 底层将功能抽象成接口, 或者设计为抽象类, 将功能提供出去, 而不去自己实现, 避免底层和高层实现存在较多的直接关联

接口隔离

   使用多个专门的接口,而不使用单一的总接口,不强迫新功能实现不需要的方法

        接口与接口独立, 也就是说, 一个接口应与另一个接口没有任何关系, 一个接口对应一个功能, 独立的功能间不要相互牵扯

迪米特原则

   一个对象应当对其他对象尽可能少的了解,降低耦合

       对象隔离 , 对象之间应该尽可能的少互相联系, 虽然对象与对象间存在一定的联系是无可避免的, 但如果这些对象之间关联较多, 则会将程序复杂化, 不利于程序的扩展等

       如果两者间非要联系不可, 我们可以提供代理, 让代理去沟通两者间的关系

 组合/聚合复用原则

优先使用组合,使系统更灵话,其次才考虑继承,达到复用的目的

      如果我们要完成一个功能 , 要多种类共同配合的话, 那么这几个类最好是同一级别的 , 最好不要出现继承关系 , 因为继承体系太多的话, 会将代码复杂化,  所以一般我们优先考虑以组合的方式来解决问题, 其次才考虑继承的方式

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值