【面向对象】—依赖倒置、接口隔离

发布于: 2020 年 06 月 18 日

(DIP)依赖倒置三条件

  • 高层模块不能依赖低层模块,而是依赖抽象

  • 抽象不能依赖实现

  • 实现依赖抽象

简述:依赖倒置原则的关键在与抽象,抽象是独立的个体,不依赖其他的实现,只能被依赖或者实现。

基于SpringCloud Gateway的Filters 模型来阐述下依赖倒置原则。

SpringCloud Gateway Filter 原理图:

基于SpringCloud Gateway 的 AddRequestHeaderGatewayFilterFactory 说明;

AddRequestHeaderGatewayFilterFactory 类

作用:请求过程中在Header头中加入指定的值

示例:

- id: login-service
uri: lb://login-service
predicates:
- Path=/ln/**
filters:
- StripPrefix=1
- AddRequestHeader=X-Server-ID, cloud-login-service

AddRequestHeaderGatewayFilterFactory UML图如下:

AddResponseHeaderGatewayFilterFactory UML 类:

配置文件中加入了以下参数就表示启用了AddRequestHeaderGatewayFilterFactory类

filters:
- StripPrefix=1
- AddRequestHeader=X-Server-ID, cloud-login-service

查看AddRequestHeaderGatewayFilterFactory类的UML图,可以看出,继承抽象类AbstractChangeRequestUriGatewayFilterFactory ->AbstractGatewayFilterFactory 对应Gateway 的filter模型并没有依赖底层模块AddRequestHeaderGatewayFilterFactory类,而是依赖了最低层的AbstractChangeRequestUriGatewayFilterFactory(GatewayFilterFactory)的抽象。

对比AddRequestHeaderGatewayFilterFactory的UML类图,AddResponseHeaderGatewayFilterFactory的UML类型可知,其都依赖抽象类AbstractChangeRequestUriGatewayFilterFactory类,既满足,高层不依赖底层而是依赖抽象,AddRequestHeaderGatewayFilterFactory,AddResponseHeaderGatewayFilterFactory 均为AbstractChangeRequestUriGatewayFilterFactory的实现,那么满足的是抽象是不依赖实现的,而实现却要依赖抽象。

当我们我们自定义Filter同样的只需要继承AbstractChangeRequestUriGatewayFilterFactory即可,然后配置到对应的配置文件中,即可以使用Filter处理自己的逻辑,这些需要做的框架都给你处理好,并不需要我们去做一些处理。

ISP(接口隔离原则)

  • 不应该强迫客户端程序依赖他们不需要的方法

接口分离原则指在设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。即,一个类要给多个客户使用,那么可以为每个客户创建一个接口,然后这个类实现所有的接口;而不要只创建一个接口,其中包含所有客户类需要的方法,然后这个类实现这个接口。

基于ISP原则的案例分析以及优化

需求:存在一个Cache类,Cache类中的方法如图,Cache支持远程的Cache(比如Redis)与本地的Cache,要求在程序运行期间,去改变Cache 使用的方式,从本地Cache变成远程Cache,客户端通过Cache类提供的get put delet 不受影响,对于客户端是无感知的操作。

Cache类的设计缺陷:客户端在使用Cache类的时候存在reBuild 方法,该方法是用来重新加载Cache支持的方式,存在一种场景,客户端错误调用reBuild方法后会导致Cache失效,而该类的设计违反了ISP原则。

优化:

思想: 将Cache 抽离出两个接口ReloadConfig,InnerCache

ReloadConfig:用来重新加载配置文件,在运行期动态扩展使用的是远程Cache还是本地Cache

InnerCache : 只提供 get 、 put、delete 方法给客户端使用。

ProxyCache:CacheTemplate在调用get/put/delete 方法的时候实际上是需要通过ProxyCache来对远程/本地Cache进行操作的,代理类的生存实在重新Reload配置成功之后生成。

ReloadCacheManage: 作用于管理配置文件的加载

CacheTemplate :提供给客户端的工具方法,包括:get、put、delete 。

发布于: 2020 年 06 月 18 日 阅读数: 19
用户头像

不二架构

关注

还未添加个人签名 2018.04.28 加入

还未添加个人简介

评论

发布
暂无评论
【面向对象】—依赖倒置、接口隔离