3)依賴倒置原則(Dependence Inversion Principle)
定義:
1、High-level modules should not depend on low-level modules. Both should depend on abstractions.(高級模塊不應依賴於低級模塊。兩者都應依賴抽象)
2、Abstractions should not depend on details. Details should depend on abstractions.(抽象不應依賴細節。細節應依靠抽象)
比如需要實施某一個項目,暫時分爲前端和後端開發者,一般是這樣設計
前端開發者類
public class BackEndDeveloper {
public void writeJava() {
}
}
後端開發者類
public class FrontEndDeveloper {
public void writeJavascript() {
}
}
項目整體實施類
public class Project {
private BackEndDeveloper backEndDeveloper = new BackEndDeveloper();
private FrontEndDeveloper frontEndDeveloper = new FrontEndDeveloper();
public void implement() {
backEndDeveloper.writeJava();
frontEndDeveloper.writeJavascript();
}
}
上面的代碼違反了依賴倒置的兩個含義
1、Project類(高級模塊)直接依賴於BackEndDeveloper (低級模塊)和FrontEndDeveloper (低級模塊);
2、Project類直接依賴於writeJava和writeJavascript等開發細節
這樣的代碼會導致一個問題是,假如FrontEndDeveloper 的工作不是寫javascript,而是改成寫typescript,project類也要更改;或者假如再增加一類中間件工作者MiddlewareDeveloper,那麼Project的implement也要更改。
那麼,根據依賴倒置原則可以怎樣設計呢?
首先定義一個開發者接口Developer
public interface Developer {
void develop();
}
再者前端和後端開發者分別實現接口
public class BackEndDeveloper implements Developer {
@Override
public void develop() {
writeJava();
}
private void writeJava() {
}
}
public class FrontEndDeveloper implements Developer {
@Override
public void develop() {
writeJavascript();
}
public void writeJavascript() {
}
}
最後Project輸出工作
public class Project {
private List<Developer> developers;
public Project(List<Developer> developers) {
this.developers = developers;
}
public void implement() {
developers.forEach(d->d.develop());
}
}
這樣設計,當低級模塊需要更改的時候,也不會影響到高級模塊了。