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