Java設計模式(3)-- 七大原則之【依賴倒置原則】

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());
    }
}

 這樣設計,當低級模塊需要更改的時候,也不會影響到高級模塊了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章