接口隔离原则(ISP)
接口隔离原则(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)相关推荐
- C#软件设计——小话设计模式原则之:接口隔离原则ISP
前言:有朋友问我,设计模式原则这些东西在园子里都讨论烂了,一搜一大把的资料,还花这么大力气去整这个干嘛.博主不得不承认,园子里确实很多这方面的文章,并且不乏出色的博文.博主的想法是,既然要完善知识体系 ...
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:htt ...
- 围观设计模式(4)--接口隔离原则(ISP,Interface Segregation Principle)
接口隔离原则(英语:interface-segregation principles, 缩写:ISP)指明没有客户(client)应该被迫依赖于它不使用方法.接口隔离原则(ISP)拆分非常庞大臃肿的接 ...
- 面向对象的六大原则之 接口隔离原则——ISP
ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应当将 ...
- 接口隔离原则_设计模式六大原则
作者:VieLei 原文:https://blog.csdn.net/s10461/article/details/53941097 在android中我们常提起的设计模式大约有23种,利用好设计模式 ...
- java 接口隔离_关于接口隔离原则的一个实现:
关于接口隔离原则的一个实现: 使用场合,提供调用者需要的方法,屏蔽不需要的方法.满足接口隔离原则. 比如说电子商务的系统,有订单这个类,有三个地方会使用到, 一个是门户,只能有查询方法, 一个是外部系 ...
- 面向对象设计原则之接口隔离原则
接口隔离原则定义如下: 接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 根 ...
- 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)
设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...
- 设计模式六大原则: 辅导班的因材施教 -- 接口隔离原则
我的女朋友小肉是一名光荣的辅导班老师,说来惭愧,我上初中那会儿最讨厌辅导班老师了,每天上学都这么累了,晚上还得去见辅导班老师,神烦,奈何目前的教育机制下,很多家长认为辅导班是提高成绩比较靠谱的方式,导 ...
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理"胖"接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有"胖"接口 ...
最新文章
- 【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )
- gzip(来源百度百科)
- 【数据结构与算法】之栈与队列的应用和操作
- WireShark之抓包过滤链接部分
- 58到家MySQL军规升级版
- ThinkPHP实现支付宝接口功能
- 使用ASP.Net WebAPI构建REST服务(四)——参数绑定
- LayUI2.2.5中文离线文档(免费免费免费)
- JxBrowser做爬虫时处理浏览器对话框
- 电路第五版课后完全答案百度扫描(免费)
- 英语的形容词变为of加名词形式的具体用法
- 免费快递查询API接口
- java 生成缩略图_java实现图片生成缩略图
- Python中的与或非
- Intellij Idea 所有快捷键列表,工欲善其事必先利其器。
- Spring Spring-data-redis 实现的消息队列
- Tribonnbsp;Draftingnbsp;consol…
- RK3288 Android5.1 隐藏 蓝牙网络共享与移动网络设置项
- EditText自动弹出输入法问题
- 雷电模拟器重置开机密码
热门文章
- DGL_图的创建、保存、加载
- 逆向工程-真码保存在系统文件破解QQ游戏对对碰助手
- Oracle数据库(三)
- 20155234 2016-2017-2 《Java程序设计》第5周学习总结
- MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 转载
- 文字滚动的另一方法 拆分文字来做到文字滚动
- ASP.NET MVC: 构建不带 Web 窗体的 Web 应用程序(转载)
- 在ACCESS中使用Group By语句
- 牛客14386 水仙花数
- 第二章 数据的表示和运算 2.1.5 汉明(海明)校验码 [计算机组成原理笔记]