zoukankan      html  css  js  c++  java
  • 面向对象设计原则

    概述

    面向对象设计原则为支持可维护性复用而诞生,面向对象设计原则也是我们用于评价一个设计模式的使用效果的重要指标之一。

    单一职责原则

    定义:一个类只负责一个功能领域中的相应职责
    单一职责原则则是实现高内聚,低耦合的指导方针。
    **高内聚:**尽可能类的每个成员方法只完成一件事(最大限度的聚合)
    **低耦合:**减少类内部,一个成员方法调用另一个成员方法
    **理解:**一个能功能不应该太过于强大,应该把这个功能拆分成多个小功能,提高代码的复用性。
    代码实现:
    将复杂类的功能,拆分开来,分解成多个小的类,让其只负责其中一个功能领域中的相应职责。

    开闭原则

    定义:软件实体应对扩展开放,而对修改关闭,即软件实体应该尽量在不修改原有代码的情况下进行扩展。
    抽象化是开闭原则的关键
    产生原因: 软件的需求会随着时间的推移而发生变化,当软件系统需要加入新的需求时,我们应该保证设计框架的稳定性。而开闭原则可以是软件系统不改变设计框架的情况下,添加新的功能。
    实现:
    利用抽象类和接口的机制

    里氏代换原则

    定义:所有引用基类对象的地方,能够透明的使用其子类的对象
    例子讲解 我喜欢动物,那我一定喜欢狗,因为狗是动物的子类,如果反过来说就不一定了,我喜欢狗,但不可以说我就喜欢动物。
    例如有两个类,一个类为BaseClass,另一个是SubClass类,并且SubClass类是BaseClass类的子类,那么一个方法如果可以接受一个BaseClass类型的基类对象base的话,如:method1(base),那么它必然可以接受一个BaseClass类型的子类对象sub,method1(sub)能够正常运行。反过来的代换不成立,如一个方法method2接受BaseClass类型的子类对象sub为参数:method2(sub),那么一般而言不可以有method2(base),除非是重载方法。
    在使用里氏代换原则时需要注意如下几个问题:
    (1)子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。根据里氏代换原则,为了保证系统的扩展性,在程序中通常使用父类来进行定义,如果一个方法只存在子类中,在父类中不提供相应的声明,则无法在以父类定义的对象中使用该方法。
    (2) 我们在运用里氏代换原则时,尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。里氏代换原则是开闭原则的具体实现手段之一。
    (3) Java语言中,在编译阶段,Java编译器会检查一个程序是否符合里氏代换原则,这是一个与实现无关的、纯语法意义上的检查,但Java编译器的检查是有局限的。
    我们看一个例子
    未使用里氏代换的
    在这里插入图片描述
    使用了里氏代换的
    在这里插入图片描述

    依赖倒转原则

    定义:抽象不应该依赖于细节,细节应该依赖于抽象,换言之,要针对接口编程,而不是针对实现编程。

    接口隔离原则

    定义:使用多个专门的接口,而不使用单一的总接口
    我么看一个栗子
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    合成服用原则

    定义:尽量适用对象组合,而不是继承来达到复用的目的

    迪米特法则

    定义:一个软件实体应当尽可能少地与其他实体发生相互作用

  • 相关阅读:
    hdu 3951(博弈规律)
    hdu 3537(博弈,翻硬币)
    hdu 3032(博弈sg函数)
    hdu 2897(威佐夫博奕变形)
    hdu 1527(威佐夫博奕)
    hdu 2516(斐波拉切博弈)
    FZU 2171(线段树的延迟标记)
    二叉数的遍历
    树和二叉树的互相转换
    树的存储
  • 原文地址:https://www.cnblogs.com/gaochunhui/p/11700619.html
Copyright © 2011-2022 走看看