服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - JAVA教程 - 简单理解遵循接口隔离原则的Java设计模式编程

简单理解遵循接口隔离原则的Java设计模式编程

2020-03-27 19:09lixiang0522 JAVA教程

这篇文章主要介绍了遵循接口隔离原则的Java设计模式编程,针对Java编程中interface接口方面的编写进行约束,需要的朋友可以参考下

定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。
解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。
举例来说明接口隔离原则:

简单理解遵循接口隔离原则的Java设计模式编程

 这个图的意思是:类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。类C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实现。对于类B和类D来说,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法),但由于实现了接口I,所以也必须要实现这些用不到的方法。

我们首先先看一个违反接口隔离的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public interface IWorker {
  public void work();
  public void eat();
}
 
public class Worker implements IWorker{
  @Override
  public void work() {
    // TODO 工人工作  
  }
 
  @Override
  public void eat() {
    // TODO 工人吃饭
  }
}
 
public class Robot implements IWorker {
  @Override
  public void work() {
    // TODO 机器人工作    
  }
 
  @Override
  public void eat() {
    // TODO 机器人吃饭? 
  }
}


由于机器人是不需要吃饭的,所以IWorker被认为是一个臃肿的接口,当然你也可以在Robot类中的eat方法做空实现,但是这样可能会产生不可预计的BUG,比如eat方法需要消耗盒饭数量的话,就会出现不对应的现象。
下面是修改后的实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface IWorker {
  public void work();
}
 
public interface IDiet {
  public void eat();
}
 
public class Worker implements IWorker, IDiet{
  @Override
  public void work() {
    // TODO 工人工作  
  }
 
  @Override
  public void eat() {
    // TODO 工人吃饭
  }
}
 
public class Robot implements IWorker {
  @Override
  public void work() {
    // TODO 机器人工作    
  }
}


总结:
1. 接口要尽量小,并高内聚,不过要适当,太细化不好维护。
2. 如果已经设计成了臃肿的接口,可以使用适配器模式隔离它。

延伸 · 阅读

精彩推荐