面向对象设计原则 ---- 接口分离原则(ISP)
ISP: Interface Segregation Principle
不应该强迫客户程序依赖他们不需要的方法。
ISP和SPR的关系:
ISP和SPR是相关的,都和“内聚性”有关
SPR指出如何设计一个类----只能有一种原因才能使类发生改变。
ISP指出如何设计一个接口----从客户的角度出发,强调不要让客户看到他们不需要的方法。
场景应用:Data Channel 数据收发:浏览器。
Connection :拨号上网。
改进评估:数据收发职责和连接职责分离
====>Modem合并实现数据收发和拨号上网挂断等功能。
客户端使用Modem的连接功能时,只需要看到Connection接口方法,
不需要看到Data Channel收据收发的接口;
客户端Modem的数据收发功能时,只需要看到Data Chnnel的接口方法,
不需要看到Connection的接口方法。
====>职责分离后,客户端看到的接口更清晰。
====>无法分解的Modem通过接口暴露给不同的应用程序。
案例二:客户对接口的反作用。
interface Door extends TimerClient{//Door 接口中包含了timeout方法,
void lock(); //对于不需要timeout机制的门是没有用的
void unlock(); //但是必须实现timeout无用方法。
boolean isOpen();
}
class Timer{
void register(int timeout,TimerClient client);
}
interface TimerClient{
void timeout();
}
解析:Timer是Door的客户,当Timer发生改变时:
class Timer{
public void register(int timeout,int timeoutId,TimerClient);
}
TimeClient被迫做出改变:
interface TimerClient{
void timeout(int timeoutId);
}
===>从而所有不需要定时功能的Door的客户程序都受到影响。
改进建议:Timer与Door两种不同的职责,进行接口隔离。
改进方案:适配器。
DoorTimerAdapter适配器实现timeout超时方法,
并将timeout超时方法,适配为 Door的lock方法,实现超时自动锁门。
改进方案二:多重继承
评论