面向对象的七大设计原则

一、开放封闭原则OCP

开放封闭原则(Open-Closed Principle,OCP)是面向对象的可复用设计(Object Oriented Design或OOD)的基石。其他设计原则(里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则)是实现开放封闭原则的手段和工具。

  • 定义
    一个软件实体应当对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。

  • 优点

    • 通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。
    • 已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。
    • 这样的系统同时满足了可复用性与可维护性。
  • 实现

    • 解决问题关键在于抽象化,抽象化是面向对象设计的第一个核心本质。
    • 在面向对象编程中,通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需更改,从而满足“对修改关闭”;而从抽象类导出的具体类可以改变系统的行为,从而满足“对扩展开放”。

二、单一职责原则SRP

单一职责原则(Single Responsibility Principle,SRP):一个类,最好只做一件事,只有一个引起它变化的原因。

一个优良的系统设计,强调模块间保持低耦合、高内聚的关系。单一职责,强调的是职责的分离。

三、里氏代换原则LSP

里氏代换原则(Liskov Substitution Principle, LSP):在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。

  • 在软件里面,把基类都替换成它的子类,程序的行为没有变化。
  • 反过来的代换不成立,如果一个软件实体使用的是一个子类的话,那么它不一定适用于基类。
  • 任何基类可以出现的地方,子类一定可以出现。

四、依赖倒转原则DIP

依赖倒转原则(dependence inversion principle, DIP):
高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
抽象不应该依赖于细节,细节应该依赖于抽象,要针对接口编程,不要针对实现编程。

应当使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型说明,以及数据类型的转换等。而不要用具体类。

  • 高层模块不应该依赖低层模块,它们都应该依赖抽象
    面向对象的七大设计原则_第1张图片
    面向对象的七大设计原则_第2张图片
    面向对象的七大设计原则_第3张图片

  • 抽象不应该依赖于细节。细节应该依赖于抽象
    面向对象的七大设计原则_第4张图片

  • 要针对接口编程,不要针对实现编程

  • 涉及到的模式有:
    • 工厂方法模式
    • 模版方法模式
    • 迭代器模式

五、迪米特法则LoD

迪米特法则(Law of Demeter,LoD):又叫做最少知识原则。就是说,一个对象应当对其他对象有尽可能少的了解。

如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

  • 涉及到的模式:
    • 门面(外观)模式
    • 中介者模式

六、合成聚合复用原则CARP

合成聚合复用原则(Composite/Aggregate Reuse Principle,CARP):在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的。应首先使用合成/聚合,合成/聚合则使系统灵活,其次才考虑继承,达到复用的目的。

  • 优先使用对象合成/聚合(UML中的两个菱形关系),而不是类继承。
  • 优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

七、接口隔离原则ISP

接口隔离原则(interface separate principle,ISP):接口隔离原则:使用多个专门的接口比使用单一的总接口要好。也就是说,一个类对另外一个类的依赖性应当是建立在最小的接口上。

  • “接口”往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象

当我们把”接口”理解成一个类所提供的所有方法的特征集合的时候,这就是一种逻辑上的概念。接口的划分就直接带来类型的划分。这里,我们可以把接口理解成角色,一个接口就只是代表一个角色,每个角色都有它特定的一个接口,这里的这个原则可 以叫做”角色隔离原则”。

面向对象的七大设计原则_第5张图片

  • 另外一种是指某种语言具体的”接口”定义,有严格的定义和结构。比如c# 语言里面的Interface结构。对于这两种不同的含义,ISP的表达方式以及含义都有所不同。

如果把”接口”理解成狭义的特定语言的接口,那么ISP表达的意思是说,对不同的客户端,同一个角色提供宽窄不同的接口,也就是定制服务,个性化服务。就是仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来。

面向对象的七大设计原则_第6张图片
面向对象的七大设计原则_第7张图片

  • 应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。

你可能感兴趣的:(设计模式)