組合而不是繼承,單一職責

2021-09-27 03:42:57 字數 1073 閱讀 9180

今天在寫c++程式的時候,有乙個使用了三年多的模型,大概是這樣的:

有乙個介面捕獲需要主視窗的滑鼠事件的時候,那麼他就需要從imouseevent繼承介面,然後像registerevent(imouseevent *event)註冊,如果有滑鼠事件,主視窗會通過呼叫虛函式來通知這個介面

我們一般的**是這樣的:

class myui:public imouseevent

myui *ui = new myui();

mainui->registerevent( ui );

這樣有兩個壞處:

1.把事件處理機制混合在視窗裡面了,隨著**的增加,滑鼠模式的處理會更加複雜,這點在現在的維護上已經體現出來了

2.myui不得不依賴imouseevent介面

想起來上次面試的時候,對方問我設計模式的問題,我一直不是很注重設計模式,可能跟我的工作有關,我更多的是在處理邏輯而不是設計,所以那次回來後我一直在想,我們的**寫得越久越難維護是不是跟我不注重設計模式有關,設計模式有乙個單一原則,能否把滑鼠處理事件移動出去,這樣就變成

class myuimouseevent:public imouseevent

然後利用組合

class myui

這樣的話,滑鼠事件對介面所進行的邏輯處理會在myuimouseevent裡面處理,看起來起碼比以前更清爽多了,也實現了單一職責(雖然我不知道這個是不是)

但是這樣的話myuimouseevent還是必須依賴於imouseevent,因為開發環境已經切換到vs2010了,開始支援bind和function系列函式了,通過這兩個函式,我們可以利用function和bind取代虛函式,而且減少標頭檔案依賴

比如在.h裡面

class myuimouseevent

myuimouseevent的標頭檔案不會產生任何的依賴,而是在cpp裡面通過bind和function繫結,然後提供新的registerevent介面專門註冊這一些列函式,三個標頭檔案沒有產生任何的依賴,比之前好多了

因為程式已經變得很大了,經常改動乙個標頭檔案的東西,一大堆的檔案都要重新編譯,所以最近越來越注意如何減少標頭檔案依賴

來自為知筆記(wiz)

為什麼優先使用組合而不是繼承

繼承具有如下優點 實現新的類非常容易,因為基類的大部分功能都可以通過繼承關係自動賦予派生類 修改或者擴充套件繼承來的實現非常容易 只要修改父類,派生的類的行為就同時被修改了。初學物件導向程式設計的人會認為繼承真是乙個好東西,是實現復用的最好手段。但是隨著應用的深入就會發現繼承有很多缺點 繼承破壞封裝...

為什麼要優先使用組合 而不是繼承?

繼承具有如下優點 實現新的類非常容易,因為基類的大部分功能都可以通過繼承關係自動賦予派生類 修改或者擴充套件繼承來的實現非常容易 只要修改父類,派生的類的行為就同時被修改了。初學物件導向程式設計的人會認為繼承真是乙個好東西,是實 現復用的最好手段。但是隨著應用的深入就會發現繼承有很多缺點 繼承破壞封...

單一職責原則

定義 不要存在多於乙個導致類變更的原因。通俗的說,即乙個類只負責一項職責。問題由來 類t負責兩個不同的職責 職責p1,職責p2。當由於職責p1需求發生改變而需要修改類t時,有可能會導致原本執行正常的職責p2功能發生故障。解決方案 遵循單一職責原則。分別建立兩個類t1 t2,使t1完成職責p1功能,t...