设计模式-面对对象设计原则

面对对象设计原则

目录

  • 单一职责原则
  • 开闭原则
  • 里氏代换原则
  • 依赖倒转原则
  • 接口隔离原则
  • 合成复用原则
  • 迪米特法则

单一职责原则

一个对象只包含单一的领域职责,并被完整地封装在类中。

  • 会增加类的数量
  • 提供复用性
  • 提高可维护性

开闭原则

一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

里氏代换原则

所有引用基类(父类)的地方必须能透明地使用其子类的对象。

  • 尽量把父类设计为抽象类或者接口
  • 子类的所有方法必须在父类中声明

依赖倒转原则

面向接口编程,不要争对实现编程。

依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。一个具体类应当只实现接口或抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。

简述:引入抽象层,在抽象层编程,具体类写进配置,避免直接使用实际对象。

优点:

  • 系统灵活性

  • 满足开闭原则,拓展时只需拓展抽象层和配置文件,避免了修改源码

  • 类耦合

    • 零耦合:两个类之间没有关系
    • 具体耦合:具体实例间的直接引用
    • 抽象耦合:抽象类之间或者抽象类与具体类之间的引用
  • 依赖注入:定义时是抽象的

    • 构造注入:通过构造函数传入
    • 设值注入:setter方法传入
    • 接口注入:在接口中声明的业务方法来传入具体类的对象。

在大多数情况下,这三个设计原则会同时出现,开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段。

接口隔离原则

使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

即按领域或功能拆分开作为分接口,不要堆在一起作为一个总的接口。

使用接口隔离原则时,在满足单一职责原则的前提下,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。

合成复用原则

又称组合/聚合复用原则,尽量使用对象组合,而不是继承来达到复用的目的。

  • 继承复用:子类继承父类实现拓展,又称白盒复用(因为对子类暴露了超类的实现细节)
    • 耦合度高
    • 破坏了系统的封装性,父类变了,子类也受影响
    • 是静态的,灵活性不足
    • 使用环境有限,如java类不能final
  • 组合复用:将一个类对象作为另一个类对象的成员变量(定义时抽象(最好)),以委托的形式去调用成员变量方法,又称黑盒复用
    • 耦合度低
    • 成员变量变化对该类影响小
    • 可以在运行时动态引用与其成员变量类型相同的其它对象实例

在系统设计时,尽可能使用组合/聚合复用;在使用继承复用时,需要严格遵守里氏代换原则,适当使用继承可以一定程度上降低系统复杂性,但请慎用。

迪米特法则

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

迪米特法则旨在降低系统的耦合度,使类与类之间保持松散的耦合关系。

你可能感兴趣的:(设计模式,设计模式,java,笔记)