设计模式6原则之:依赖倒置原则
概念
- 上层模块不应该依赖底层模块,它们都应该依赖于抽象
- 抽象不应该依赖于细节,细节应该依赖于抽象
理解
(为了方便以下代码均为伪代码)
假如我们有个课件类,需要对小节进行一些操作,目前我们业务中只用到了视频小节,我们可能会这么写:
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 '更新图文';
}
}
这样就可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。