读书人

设计形式六大原则4接口隔离原则

发布时间: 2012-09-14 23:00:49 作者: rapoo

设计模式六大原则4—接口隔离原则
接口隔离原则定义:1)客户端不该依赖它不需要的接口;2)类间的依赖关系应该建立在最小的接口上。

问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类C来说不是最小接口,则类B和类D必须去实现他们不需要的方法,如下图所示。

设计形式六大原则4—接口隔离原则

解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

举例来说明接口隔离原则:

使用Manager类代表一个管理工人的管理者。有两种类型的工人:普通的和高效的,这两种工人都需要吃午饭。现在来了一批机器人,它们同样为公司工作,但是他们不需要吃午饭。一方面Robot类需要实现IWoker接口,因为他们要工作;另一方面,它们又不需要实现IWorker接口,因为它们不需要吃饭。在这种情况下IWorker就被认为是一个被污染了的接口。

    1. // interface segregation principle - bad example
    2. interface IWorker {
    3. public void work();
    4. public void eat();
    5. }
    6. class Worker implements IWorker {
    7. public void work() {
    8. // ....working
    9. }
    10. public void eat() {
    11. // ...... eating in launch break
    12. }
    13. }
    14. class SuperWorker implements IWorker{
    15. public void work() {
    16. //.... working much more
    17. }
    18. public void eat() {
    19. //.... eating in launch break
    20. }
    21. }
    22. class Manager {
    23. IWorker worker;
    24. public void setWorker(IWorker w) {
    25. worker=w;
    26. }
    27. public void manage() {
    28. worker.work();
    29. }
    30. }

依据接口隔离的原则,我们应该把IWorker接口划分为两个独立的接口,如下面的代码所示。

  1. //interface segregation principle - good example
  2. interface IWorkable {
  3. public void work();
  4. }
  5. interface IFeedable{
  6. public void eat();
  7. }
  8. class Worker implements IWorkable, IFeedable {
  9. public void work() {
  10. // ....working
  11. }
  12. public void eat() {
  13. //.... eating in launch break
  14. }
  15. }
  16. class SuperWorker implements IWorkable, IFeedable{
  17. public void work() {
  18. //.... working much more
  19. }
  20. public void eat() {
  21. //.... eating in launch break
  22. }
  23. }
  24. class Robot implements IWorkable{
  25. public void work() {
  26. // ....working
  27. }
  28. }
  29. class Manager {
  30. IWorkable worker;
  31. public void setWorker(IWorkable w) {
  32. worker = w;
  33. }
  34. public void manage() {
  35. worker.work();
  36. }
  37. }

这样使用接口隔离原则可以防止庞大、臃肿的接口,这也就接口隔离原则的目的所在。

接口隔离尽量使用多个专门的接口,这和单一职责原则很类似。其实不然,其一,单一职责原则注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。

在依据接口隔离原则拆分接口时,首先必须满足单一职责原则。其次,在使用接口隔离原则时,应做到以下几点:

读书人网 >软件开发

热点推荐