接口隔离原则(ISP)
这个原则适用于解决“胖”接口的缺点。类的“胖”接口可以分解成多组方法,而每组方法对应于不同的客户程序。使得客户程序之间可以互不干扰。
接口污染
每当在子类中添加方法,使得基类中也要加入该方法,使得基类变“胖”,那么就是产生了接口污染。因为基类中每加入一个方法,派生类就必须实现或者定义一个缺省实现,带来维护和重用方面的问题。
分离客户就是分离接口
当部分用户需要新增某些特定功能时,他们使用的接口就得增添新的东西,而其他不需要用到这些特定功能的用户则会受到影响,使得他们必须知道一些对他们完全无用的东西。而当那个特定功能出现了bug,也会影响到其他不需要此功能的用户。故而分离.不同的用户就是分离接口。
接口隔离原则
如果强行让客户程序依赖自己不需要使用的方法,那么当这些方法改动时,客户程序也会因此受到影响。这就导致了客户程序之间的耦合。
类接口与对象接口
- 使用委托分离接口
示例:
我们有一个门(door)的类
class door
{
public:
virtual bool openDoor() = 0;
virtual void closeDoor() = 0;
virtual bool isOpenDoor() = 0;
}
现在部分用户需要它会自动关门,那么我们就需要一个时间类来检测时间与门来交互
class timeSystem
{
public:
void register(int timeOver, timeSystemClient);
}
class timeSystemClient
{
public:
virtual void timeOver() = 0;
}
此时创建一个派生自timeSystemClient的对象,并把该对象的请求委托给door的派生类timeDoor。
class timeDoor:public door
{
public:
virtual void doorTimeOver(int timeOverID);
}
class doorTimeSystemAdapter:public timeSystemClient
{
public:
doorTimeSystemAdapter:public (timeDoor& theDoor):itsTimeOverDoor(theDoor)
{}
vistual void timeOver(int timeOverID)
{
itsTimeOverDoor.doorTimeOver(timeOverID);
}
private:
timeDoor& itsTimeOverDoor;
}
这种方法遵循了ISP原则,缺点每次想注册一个超时请求就得创建一个新对象。 - 使用多重继承分离接口
class timeDoor:public door,public timeSystemClient
{
public:
virtual void doorTimeOver(int timeOverID);
}
这样处理则使得两个基类的客户都可以使用timeDoor,但是都不依赖timeDoor,从而达到分离的接口使用同一个对象。