軟件設計原則 —— 接口隔離原則和依賴倒置原則

接口隔離原則就是客戶端不應該依賴它不需要的接口。一個類對另一個類的依賴應該建立在最小的接口上。使用多個專門的接口比使用單一的總接口要好。一個類對另外一個類的依賴性應當是建立在最小的接口上的。一個接口代表一個角色,不應當將不同的角色都交給一個接口。沒有關係的接口合併在一起,形成一個臃腫的大接口,這是對角色和接口的污染。(百度百科概念)。看着可能比較懵逼。簡單的說就是應該使用多個接口,而不是一個包含所有方法的接口。舉個例子:在單一職責原則和開閉原則裏我們分別創建了WeChatMsgHandler和WeChatEventHandler接口。如果我們只創建一個接口:

public interface WeChatMsgHandelr{
    String msgHandelr(WechatMsg wechatMsg);
    String eventHandelr(WechatMsg wechatMsg);
}

我們在處理事件消息的時候可以用到eventHandelr方法,但是我們處理文本消息,圖片消息時 eventHandelr方法明顯是多餘的,並沒有用到該方法。因此我們使用兩個接口分別處理:

public interface WeChatMsgHandelr{
    String msgHandelr(WechatMsg wechatMsg);
}
public interface WeChatEventHandelr{
    String eventHandelr(WechatMsg wechatMsg);
}

接口隔離原則符合我們常說的高內聚低耦合的設計思想,可以使類具有很好的可讀性,可擴展性和可維護性。我們在設計接口的時候要多花時間去思考,考慮業務模型,包括有可能發生變更的地方。

依賴倒置原則(Dependence Inversion Principle)是程序要依賴於抽象接口,不要依賴於具體實現。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。(恩,也是百度百科說的)。通過依賴倒置,可以減少類與類之間的耦合性,提高系統的穩定性,提高代碼的可讀性和可維護性,並且能夠降低修改程序所造成的風險。還是以處理微信消息爲例子,創建一個微信消息處理類:

public class WeChatMsgService{
    public String textMsgHandler() {
        //TODO
    }
    public String ImageMsgHandler() {
        //TODO
    }
}

如果我們想要新增語音和視頻消息處理,那麼就需要在原類中添加處理語音消息和視頻消息的方法,因爲業務擴展,要從底層到高層(調用層)依次修改代碼。如此以來,系統發佈之後,實際上是不穩定的,再修改代碼的同時也會帶來意想不到的風險。接下來我們優化代碼,創建一個抽象WeChatMsgHandler的接口,接口最上面的例子,然後再編寫消息處理類:

public class TextMsgHandler implements WeChatMsgHandler {
    @Override
    public String MsgHandler(WxMpXmlMessage weChatMsg) {
        //TODO
    }
}
public class VoiceMsgHandler implements WeChatMsgHandler {
    @Override
    public String MsgHandler(WxMpXmlMessage weChatMsg) {
        //TODO
    }
}
public class ImageMsgHandler implements WeChatMsgHandler {
    @Override
    public String MsgHandler(WxMpXmlMessage weChatMsg) {
        //TODO
    }
}

這個時候無論想新增處理什麼樣的消息,都無需修改底層代碼,只需要新增一個類即可。再結合依賴注入方式,完全不需要修改調用者部分代碼。

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