面向对象设计原则 ---- 接口分离原则(ISP)

用户头像
张荣召
关注
发布于: 2020 年 09 月 27 日

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方法,实现超时自动锁门。

 

 改进方案二:多重继承

      



用户头像

张荣召

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
面向对象设计原则----接口分离原则(ISP)