设计模式6原则之:依赖倒置原则

概念

  1. 上层模块不应该依赖底层模块,它们都应该依赖于抽象
  2. 抽象不应该依赖于细节,细节应该依赖于抽象

理解

(为了方便以下代码均为伪代码)

假如我们有个课件类,需要对小节进行一些操作,目前我们业务中只用到了视频小节,我们可能会这么写:

class Courseware {
  public function updateVideoChapter(VideoChapter chapter) {
    chaper->update();
  }
}

使用了一段时间之后,产品过来说我们需要增加小节类型,分别增加一个文档小节和图文小节,于是我们修改了代码:

class Courseware {
  public function updateVideoChapter(VideoChapter chapter) {
    chaper->update();
  }
  
  public function updateDocumentChapter(DocumentChapter chapter) {
    chaper->update();
  }
  
  public function updateImageWordChapter(ImageWordChapter chapter) {
    chaper->update();
  }
}

这样依赖具体类的坏处就是,以后如果增加了更多的类型,我需要在课件类中增加同样数量的方法。另一方面调用这个方法的地方如果很多,一旦需要修改方法名或者方法所依赖的参数,那就需要修改很多地方。这样会影响系统的稳定性和维护成本。这时候就需要用到依赖倒置原则。

我们可以修改上面的代码:

class Courseware {
  public function updateChapter(IChapter chapter) {
    chaper->update();
  }
}

interface Ichapter {
  public function update();
}

class VideoChapter implements Ichapter {
  public function update() {
    echo '更新视频';
  }
}

class DocumentChapter implements Ichapter {
  public function update() {
    echo '更新文档';
  }
}

class ImageWordChapter implements Ichapter {
  public function update() {
    echo '更新图文';
  }
}

这样就可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。