【设计模式攻略】OO设计原则之ISP-接口隔离原则

概要
所谓接口隔离,就是把可以分离的方法分离到不同的接口类中,防止在实际应用中被迫去实现一些本并不需要的接口方法。其实一定程度上跟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模式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值