场景
例题:设计学生信息管理系统,有查询成绩search、修改成绩update、增加成绩insert、删除成绩delete、打印成绩print等功能
不使用接口隔离原则的解法:
代码实现:
public interface HandleScore {
void insert();
void delete();
void search();
void updata();
void print();
}
public class Student implements HandleScore{
public static void main(String[] args) {
}
@Override
public void insert() {}
@Override
public void delete() { }
@Override
public void search() {}
@Override
public void updata() {}
@Override
public void print() {
System.out.println("输出学生成绩");
}
}
//缺点,存在接口污染
//因为学生只能查询成绩,不能修改,删除记录
//HandleScore接口存在Student不需要的方法
//家排污管理人员实现修改查询接口
public class Academic implements Updatable,Searchable,Printable {
@Override
public void print() {}
@Override
public void search() {}
@Override
public void updata() { }
}
存在问题:如果学生仅仅能够查询成绩,学生类Student实现这个接口,存在不需要的方法,即接口污染
接口隔离原则的概念
接口隔离原则有四个作用:
(1)避免接口污染:一个类如果要实现一个接口,那么就要实现这个接口的所有方法,如果这个接口包含这个类不需要的方法,就会造成接口污染,为系统留下隐患
(2)提高灵活性:一个类可以同时实现多个接口,所以将一个臃肿的接口分割为若干个小接口,通过小接口的不同组合可以满足更多的需求
(3)提高定制服务:通过细化接口为访问者提高需要的方法
(4)实现高内聚:高内聚就是接口、类、模块中定义了一组相关的行为。接口是对外界的承诺,承诺越少对系统的开发越有利,变更的风险也就越少,同时也有利于降低成本。通过细化接口实现高内聚。
使用接口隔离原则的解法:
代码实现:
//对HandleScore接口进行细化
//修改接口
public interface Modifyable{
void delete();
void insert();
}
//输出学生成绩接口
public interface Printable {
void print();
}
//查询学生成绩接口
public interface Searchable {
void search();
}
public class Student implements Searchable{
@Override
public void search() {
}
}
public class Teacher implements Searchable,Updatable,Printable {
@Override
public void print() { }
@Override
public void search() {}
@Override
public void updata() { }
}
public interface Updatable {
void updata();
}