接口隔离原则(The Interface Segregation Interface)

这个原则用来处理“胖(fat)”接口(类的接口不是内聚的)所具有的缺点。“胖”接口可以分解成多组方法。

考虑一个安全系统,有一些Door对象,可以被加锁和解锁,并且Door对象知道自己开关状态。

public interface Door {public void lock();public void unlock();public boolean isOpen();
}

考虑一个这样的实现,TimedDoor 如果门开着的时间过长,它就会发出警报声。为了做到这一点,TimedDoor 对象需要和另一个名为Timer 的对象交互。

public interface Timer {// 注册超时服务public void register(int timeout, TimerClient client);
}public interface TimerClient {// 超时后执行public void timeout();
}

如果一个对象希望得到超时通知,它可以调用Timer 的register 函数。我们怎样将TimeClient 类
和TimedDoor 类联系起来,才能在超时时通知到TimedDoor 中相应的处理代码呢?如下是一个容易想到的解决方案。

这个方案最主要的问题:现在Door 类依赖TimeClient 了。可是并不是所有种类的Door 都需要定时功能。

分离客户就是分离接口

Door 接口和TimerClient 接口是被完全不同的客户程序使用的。Timer 使用TimerClient,而操作门的类使用Door。既然客户程序是分离的,所以接口也应该保持分离。

客户对接口施加的反作用力

例如,有些Timer 的使用者会注册多个超时通知请求。比如对于TimedDoor 来说。当它检测到门被打开时,会向Timer 发送一个register() 消息,请求一个超时通知。可是,在超时到达前,门关上了,关闭一会儿后又被再次打开。这就导致在原先的超时到达前又注册了一个新的超时请求。最后,最初的超时到达,TimedDoor 的 timeout() 方法被调用。Door 错误地发出了警报。

修复,在每次超时注册中都包含一个唯一的 timeoutID 码,并在调用TimerClient 的timeout() 方法时,再次使用该标识码。

public interface Timer {// 注册超时服务public void register(int timeout, int timeoutID, TimerClient client);
}public interface TimerClient {// 超时后执行public void timeout(int timeoutID);
}

显然,这个改变会影响到TimerClient 的所有使用者。还会影响到Door 以及Door 的所有客户程序。这是僵化性和粘滞性的臭味。

接口隔离原则(ISP)

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

1、使用委托分离接口

public TimedDoor implements Door {public void doorTimeout(int timeoutID);// 其他接口方法实现...
}public class DoorTimeAdapter implements TimerClient {private TimedDoor itsTimeDoor;public DoorTimeAdapter(TimedDoor theDoor) {this.itsTimeDoor = theDoor;}public void timeout(int timeoutID) {itsTimeDoor.doorTimeout(timeoutID);}
}

2、使用多重继承分离接口(推荐)

接口隔离原则(ISP)相关推荐

  1. C#软件设计——小话设计模式原则之:接口隔离原则ISP

    前言:有朋友问我,设计模式原则这些东西在园子里都讨论烂了,一搜一大把的资料,还花这么大力气去整这个干嘛.博主不得不承认,园子里确实很多这方面的文章,并且不乏出色的博文.博主的想法是,既然要完善知识体系 ...

  2. 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:htt ...

  3. 围观设计模式(4)--接口隔离原则(ISP,Interface Segregation Principle)

    接口隔离原则(英语:interface-segregation principles, 缩写:ISP)指明没有客户(client)应该被迫依赖于它不使用方法.接口隔离原则(ISP)拆分非常庞大臃肿的接 ...

  4. 面向对象的六大原则之 接口隔离原则——ISP

    ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应当将 ...

  5. 接口隔离原则_设计模式六大原则

    作者:VieLei 原文:https://blog.csdn.net/s10461/article/details/53941097 在android中我们常提起的设计模式大约有23种,利用好设计模式 ...

  6. java 接口隔离_关于接口隔离原则的一个实现:

    关于接口隔离原则的一个实现: 使用场合,提供调用者需要的方法,屏蔽不需要的方法.满足接口隔离原则. 比如说电子商务的系统,有订单这个类,有三个地方会使用到, 一个是门户,只能有查询方法, 一个是外部系 ...

  7. 面向对象设计原则之接口隔离原则

    接口隔离原则定义如下: 接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 根 ...

  8. 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

    设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...

  9. 设计模式六大原则: 辅导班的因材施教 -- 接口隔离原则

    我的女朋友小肉是一名光荣的辅导班老师,说来惭愧,我上初中那会儿最讨厌辅导班老师了,每天上学都这么累了,晚上还得去见辅导班老师,神烦,奈何目前的教育机制下,很多家长认为辅导班是提高成绩比较靠谱的方式,导 ...

  10. 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则

    第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理"胖"接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有"胖"接口 ...

最新文章

  1. 【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )
  2. gzip(来源百度百科)
  3. 【数据结构与算法】之栈与队列的应用和操作
  4. WireShark之抓包过滤链接部分
  5. 58到家MySQL军规升级版
  6. ThinkPHP实现支付宝接口功能
  7. 使用ASP.Net WebAPI构建REST服务(四)——参数绑定
  8. LayUI2.2.5中文离线文档(免费免费免费)
  9. JxBrowser做爬虫时处理浏览器对话框
  10. 电路第五版课后完全答案百度扫描(免费)
  11. 英语的形容词变为of加名词形式的具体用法
  12. 免费快递查询API接口
  13. java 生成缩略图_java实现图片生成缩略图
  14. Python中的与或非
  15. Intellij Idea 所有快捷键列表,工欲善其事必先利其器。
  16. Spring Spring-data-redis 实现的消息队列
  17. Tribonnbsp;Draftingnbsp;consol…
  18. RK3288 Android5.1 隐藏 蓝牙网络共享与移动网络设置项
  19. EditText自动弹出输入法问题
  20. 雷电模拟器重置开机密码

热门文章

  1. DGL_图的创建、保存、加载
  2. 逆向工程-真码保存在系统文件破解QQ游戏对对碰助手
  3. Oracle数据库(三)
  4. 20155234 2016-2017-2 《Java程序设计》第5周学习总结
  5. MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 转载
  6. 文字滚动的另一方法 拆分文字来做到文字滚动
  7. ASP.NET MVC: 构建不带 Web 窗体的 Web 应用程序(转载)
  8. 在ACCESS中使用Group By语句
  9. 牛客14386 水仙花数
  10. 第二章 数据的表示和运算 2.1.5 汉明(海明)校验码 [计算机组成原理笔记]