概要
所谓接口隔离,就是把可以分离的方法分离到不同的接口类中,防止在实际应用中被迫去实现一些本并不需要的接口方法。其实一定程度上跟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模式。