您的位置:首页 > 其它

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

2012-04-01 16:33 369 查看
概要
所谓接口隔离,就是把可以分离的方法分离到不同的接口类中,防止在实际应用中被迫去实现一些本并不需要的接口方法。其实一定程度上跟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模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: