軟件設計原則 —— 開閉原則

開閉原則(Open-Closed Principle)是指一個軟件實體(類,模塊和函數)應該對擴展開放,對修改關閉。它是針對擴展和修改兩個行爲的原則。它強調用抽象構建框架,用實現擴展細節,用以提高系統的可複用性和可維護性,該原則是讓在增加新功能的同時儘量不修改已有代碼。

幾乎任何一款優秀的框架都使用了開閉原則,比如Spring,我們使用Spring的時候不需要修改Spring源代碼,就可以集成很多其他框架,增加功能。這裏我們使用項目中的微信公衆號的消息接收爲案例,我們在開發微信公衆號時,可以接收微信服務器發來的多種消息:text,image,voice,event等類型的消息,如果一股腦的代碼就是一個類處理所有的消息:

public void msgHandler(Wechatmsg wechatMsg) {
    String msgType = wechatMsg.getMsgType();
    switch(msgType) {
	case "text":
	    break;
	case :"voice"
	    break;
	default:
			
    }
}

上面我們處理了微信的兩種消息,如果有新需求需要處理圖片消息,視頻消息等,只能在源代碼中接着加case語句,這肯定是違背了開閉原則。開閉原則強調用抽象構建框架,用實現擴展細節,因此我們可以創建微信消息處理接口:

public interface WeChatMsgHandler {
    //定義消息類型處理器名稱
    String getName();
    //處理微信消息
    void msgHandler(WechatMsg weChatMsg);
}

如果我們想要處理文本消息,則只需要實現該接口即可,如果想要處理其他類型的消息,也只需要實現WeChatMsgHandler接口,完美的實現了開閉原則。

public class WeChatTextMsgHandler implements WeChatMsgHandler {
    @Override
    public String getName() {
	return "text";
    }

    @Override
    public void msgHandler(WechatMsg weChatMsg) {
        //處理文本消息
    }
}

而前面的複雜的switch case語句則就可以改成如下形式,這樣子無論是添加新的消息處理器,還是修改其中的一個消息處理器都不會影響到其他的消息處理。

public void msgHandler(Wechatmsg wechatMsg) {
    String msgType = wechatMsg.getMsgType();
    //map存儲的爲WeChatMsgHandler實例,key爲WeChatMsgHandler的getName();
    WeChatMsgHandler wechatMsgHandler = map.get(msgType);
    wechatMsgHandler.msgHandler(weChatMsg);
    }
}

開閉原則只是一種原則,可以有很多種實現滿足這種原則,代碼的實現需要結合具體的場景。

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