博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式攻略】OO设计原则之ISP-接口隔离原则
阅读量:3523 次
发布时间:2019-05-20

本文共 1274 字,大约阅读时间需要 4 分钟。

概要
所谓接口隔离,就是把可以分离的方法分离到不同的接口类中,防止在实际应用中被迫去实现一些本并不需要的接口方法。其实一定程度上跟SRP原则类似。只是ISP更关注与接口实现和使用,而SRP更关注于接口本身。
目的
接口用户不应该被迫去实现和依赖一些本不会使用的接口方法。
实例与效果
假设我们需要实现通信的接口,基于通信的一些基本功能,我们可能会设计这样的接口:
class IComm {public:     virtual void Connect() = 0;     virtual void Listen() = 0;     virtual void Receive() = 0;     virtual void Send() = 0;};
貌似Perfect!然后我们继承于IComm 的实现接口方法。
class SComm : public IComm{     ......};class SMessage : public IComm{     ......};class SConnect : public IComm{     ......};
这时有个客户类是这样的,
class Client {     void SetCommHandler(IComm* comm);     voidReceive() { comm->Receive();}     void Send() { comm->send();}};
客户只需要收发消息的功能,而不需要监听和连接的功能,也就是说对于SetCommHandler方法,其实只需要设定实现了收发消息接口方法的对象,而如上的结果是,所有类的实现都必须实现IComm 接口的所有方法。这时对传递给SetCommHandler的参数对象中其实存在了多余的接口,造成接口污染。
怎么改进呢?重新设计接口。
class IConnect {public:     virtual void Connect() = 0;     virtual void Listen() = 0;};class IComm {     virtual void Receive() = 0;     virtual void Send() = 0;};
如果当前需求只需要收发消息,可以考虑只实现IComm,如果两种需求都有就都实现。
class SComm : public IComm, IConnect {     ......};class SMessage : public IComm{     ......};class SConnect : public IConnect{     ......};
可以发现,如此设计后暴露给只需要收发功能的Client类的只有IComm下的接口,而当面对特定需求时,你也不需要去实现一些冗余的接口。比如SMessage类就只需要去实现Receive/Send方法。
应用
实际应用中,也可以通过委托机制来实现接口隔离,参照Adapt模式。

转载地址:http://odeqj.baihongyu.com/

你可能感兴趣的文章
数据结构之栈
查看>>
Elastic Stack简介
查看>>
关于deepin系统安装design compiler的问题解答
查看>>
Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时
查看>>
记录一下最近的学习经历
查看>>
hadoop3.0+spark2.0两台云服务器集群环境配置。
查看>>
记第一次面试经历
查看>>
网站实现qq登录(springboot后台)
查看>>
简单的用户头像修改功能(springboot后台)
查看>>
springboot+mybatis实现分页
查看>>
leetcode332. 重新安排行程
查看>>
为什么局域网网段不同不能通信?
查看>>
itchat微信助手,kaggle 电影数据集分析,基于内容的电影推荐
查看>>
认识和使用JWT
查看>>
通过springboot框架,自己动手实现oauth2.0授权码模式认证
查看>>
条件表达式于运算符的点点滴滴的积累
查看>>
最短路径最基本的三种算法【此后无良辰】
查看>>
class的点点滴滴的总结
查看>>
vector 的点点滴滴的总结
查看>>
测试用例
查看>>