接口隔离原则 (ISP:Interface Segregation Principle)

定义

ISP根据GoF中原文定义如下

Clients should not be foreced to depend on methods that they do not used.

即 客户端不应该强制依赖于它们所不使用的方法。否则的话,客户端将会因为这些方法的变更也需要做相应的调整,也就是说,会造成需要做多余且无用的工作。

实例演示

以数据库操作为例,请看以下接口的定义。

public interface OpenDatabase{
    boolean open(String connection); // 打开数据库
    boolean close(); // 关闭数据库
    boolean isConnected(); // 数据库是否连接
    boolean isSqlServer(); // 判断是否是 SQL Server 数据库
}

在以上的示例中,可以看到,前面三个函数都是数据库打开常用的函数,所有数据库操作客户端都会用到。但是第四个函数 bool isSqlServer(); 则只对部分客户端有用,因为在大部分应用场景中,所用到的数据库类型都是已知的,并不需要用到这个操作。因此,这个函数对这部分应用来说就是多余的。如果这个函数发生了变更,比如为了统一命名规范,将签名中的 Sql 全大写,即修改为:boolean isSQLServer();,这时候,所有实现到这个接口的类都需要进行函数名称的相应修改。

所以正确的作法是,将最后一个函数分离出来,比如再建立一个 DatabaseProperty 接口,中间定义一些获得数据库属性,如是否是SQL Server,是什么版本,是本地还是远程,是单一服务器还是分布式等属性的接口函数。这样对于需要操作多数据库源的应用中,再进行实现。而对单数据库源且类型已知的应用中,则不需要用到。

总结

ISP就是针对接口的约束,即将接口根据使用功能进行分类,使不同功能的接口函数放在不同的接口中,从而减少耦合,以避免一些多余的修改。

上一篇:动态规划一-博弈类


下一篇:avr isp:uisp