2016-12-28 单一职责原则+依赖倒转原则+里氏替换原则+开放封闭原则+接口隔离原则

前端之家收集整理的这篇文章主要介绍了2016-12-28 单一职责原则+依赖倒转原则+里氏替换原则+开放封闭原则+接口隔离原则前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

单一职责原则+依赖倒转原则+里氏替换原则+开放封闭原则+接口隔离原则

单一职责原则-SRPSingle responsibility principle

就一个类而言,应该只有一个导致其变化的原因。一个职责就是一个变化的轴线,一个类如果承担的职责过多,就等于将这些职责耦合在一起。一个职责的变化可能影响到其他职责。

什么是职责?

职责是“变化的原因”

例如某一个类现在同时具有“连接”和“通信”两种职责,根据单一职责原则,则可能存在两种处理方式:

1:“连接”和“通信”可能独立变化时

这种情况下,应该把职责分开。例如,应用的变化导致“连接”部分方法的签名(signature)发生了变化,那么使用数据“连接”的部分也需要重新编译,部署,这会相当麻烦,使得设计僵化。

2:“连接”和“通信”同时变化时

这种情况下,不必将职责分开。反而分离可能导致“不必要的复杂性”。


开放封闭原则-OCPOpen-Closed Principle

软件实体(类、模块、函数等)应该是可以扩展的,同时还可以是不必修改的,更确切地说,函数实体应该:

1:对扩展是开放的

当应用的需求变化时,我们可以对模块进行扩展,使其具有满足改变的新的行为--即我们可以改变模块的功能

2:对更改是封闭的

对模块进行扩展时,不必改动已有的源代码或二进制代码

如果任何修改都需要改变已经存在的代码,那么可能导致牵一发动全身现象。

事实上没有对所有变化的情况都封闭的模型,我们可以预测它们,或则直到我们发现他们才行动。

如下面的示例:

class ClentInterface{

virtual void ServerFunc() = 0;

};


class server:public ClientInterface {

int serverData;

public

void ServerFunc();

}

Class client{

ClientInterface& ci;

client(ClientInterface &CI):ci(CI){

}

void useServer(){

ci.ServerFunc();

一个问题: 为什么上述的ClientInterface这个类要取这个名字,叫做AbstractServer岂不更好?

其实这里面蕴含了一个思想:

client类中更多的描述了高层的策略,而Server类中对这些策略的一种具体实现。而接口是策略的的一个组成部分,他跟client端的关系更加密切

我们可以这样想问题;ClientInterface中定义了client期望Server做什么,而server具体类是对client这种要求的一种具体实现。

OCP原则其实是要求我们清晰的区分策略和策略的具体实现形式。允许扩展具体的实现形式(开放),同时将这种扩展与策略隔离开来,使其对上层的策略透明(封闭)。

一般情况下,无论模块多么“封闭”,都会存在一些无法对之封闭的变化,没有对所有变化的情况都封闭的模型

接口隔离原则-ISP-Interface Segregation Principle

不应该强迫客户依赖于他们不用的方法

一个类的不内聚的“胖接口”应该被分解成多组方法,每一组方法都服务于一组不同的客户程序。

依赖倒置原则-DIPDependency Inversion Principle

高层模块不应该依赖于底层模块。二则应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。

所谓“倒置”是相对于传统的开发方法(如结构化开发方法)中总是倾向于让高层模块依赖于底层模块而言的。

高层包含应用程序的策略和业务模型,而底层包含更多的实现细节,平台相关细节等。高层依赖底层将导致:

难以复用:底层改变一个软硬件平台将导致一些具体的实现发生变化,如果高层依赖底层,这种变化将导致逐层的更改。

难以维护:底层通常是易变的。

良好的OO体系结构都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口向外提供了一组内聚的服务。

依赖关系倒置:下层的实现,依赖于上层的接口。

接口所有权倒置:客户拥有接口,而服务者则从这些接口派生。

依赖不倒置的开发

自顶向下首先设计整个软件的分解结构

然后首先实现下层的功能

再实现上层的功能,并使上层调用下层函数

依赖倒置的开发

首先设计上层需要调用的接口,并实现上层

然后底层类从上层接口派生,实现底层

接口属于上层

LisKov替换原则-LSP-Liskov Substitution Principle

子类型Subtype必须能够替换他们的基类型(Basetype),若对每个类型S的对象O1,都存在一个类型T的对象O2,使得所有针对T编写的程序P中,用O1替换O2后,程序P的行为功能不变,则S是T的子类型。

依赖倒置原则(DIP):Dependency Inversion Principle

dependency |dɪˈpendənsi| noun 依赖

inversion |ɪnˈvɜːʃn,American ɪnˈvɜːrʒn| noun 倒转 颠倒

principle |ˈprɪnsəpl| noun 原则

LisKov替换原则(LSP):Liskov Substitution Principle

substitution |ˌsʌbstɪˈtjuːʃn,American -ˈtuː-| noun 代替 替换

单一职责原则(SRP):Single responsibility principle

responsibility |rɪˌspɒnsəˈbɪləti| noun 负责 义务 职责

开放封闭原则(OCP):Open-Closed Principle

接口隔离原则(ISP):Interface Segregation Principle

segregation |ˌsegrɪˈgeɪʃn| noun 分离 分开


substitute |ˈsʌbstɪtjuːt,American -tuːt| n 替身 vt 代替

segregate |ˈsegrɪgəɪt| v 使孤立、使....分开、隔开

signature |ˈsɪgnətʃə(r)| n 名、

猜你在找的设计模式相关文章