面向对象设计的六大原则

面向对象设计的六大原则

  1. 单一职责原则(SRP) Single Responsibility Principle
  2. 开闭原则(OCP) Open Closed Principle
  3. 里氏替换原则 (LSP老色批原则 Liskov Substitution Principle
  4. 依赖倒置原则(DIP) Dependence Inversion Principle
  5. 接口隔离原则(ISP) Interface Segregation Principle
  6. 迪米特原则(LOD) Law of Demeter

单一职责原则

单一职责原则,Single Responsibility Principle,简称SRP。其定义是应该 有且仅有一个类引起类的变更 ,这话的意思就是一个类只担负一个职责。( 一个职责的接口是可以有多个方法的)
单一职责原则的优点:

  • 类的复杂性降低,实现什么职责都有明确的定义;
  • 逻辑变得简单,类的可读性提高了,而且,因为逻辑简单,代码的可维护性也提高了;
  • 变更的风险降低,因为只会在单一的类中的修改。

开闭原则

开闭原则,Open Closed Principle,是Java世界里最基础的设计原则,其定义是:

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭

一个软件实体应该通过扩展来实现变化,不应对已有代码进行修改来实现变化
遵循开闭原则的最好手段就是抽象或接口

里氏替换原则

里氏替换原则,英文名Liskov Substitution Principle,它的定义是

如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有对象o1都替换成o2的时候,程序P的行为都没有发生变化,那么类型T2是类型T1的子类型。

简单的定义:

只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何异常。 并且子类可以扩展父类没有的功能,同时子类还不能改变父类原有的功能。

四个规范

1、子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
2、子类可以有自己的属性和方法。
3、子类覆盖或重载父类的方法时输入参数可以被放大。
4、子类覆盖或重载父类的方法时输出结果可以被缩小,也就是说返回值要小于或等于父类的方法返回值。

确保程序遵循里氏替换原则可以要求我们的程序建立抽象,通过抽象去建立规范,然后用实现去扩展细节,所以,它跟开闭原则往往是相互依存的。

依赖倒置原则

依赖倒置原则,Dependence Inversion Principle,简称DIP,它的定义是:

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

底层模块:不可分割的原子逻辑,高层模块:原子逻辑的再组装
抽象就是指接口或抽象类,两者都不能被实例化;而细节就是实现接口或继承抽象类产生的类,也就是可以被实例化的实现类。依赖倒置原则是指模块间的依赖是通过抽象来发生的,实现类之间不发生直接的依赖关系,其依赖关系是通过接口是来实现的。

接口隔离原则

客户端不应该依赖它不需要的接口,一个接口一个功能

迪米特原则

迪米特原则,Law of Demeter,简称LoD,也被称为最少知识原则,它描述的规则是:

一个对象应该对其他对象有最少的了解

一个类应该对自己需要耦合或调用的类知道的最少,类与类之间的关系越密切,耦合度越大,那么类的变化对其耦合的类的影响也会越大,这也是我们面向设计的核心原则:低耦合,高内聚。

迪米特法则还有一个解释:只与直接的朋友通信。

迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。

我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。

两个优点

  1. 降低了类之间的耦合度,提高了模块的相对独立性。
  2. 由于亲合度降低,从而提高了类的可复用率和系统的扩展性。

但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。

上一篇:Codeforces - A. Watermelon


下一篇:设计模式七大原则