實現同一介面的不同類使用組合實現了多態,但是這破壞了DRY嗎?
01-27
前提:單根繼承OO語言如 java7, objc 等,且不具備 mix-in 等高級方案。
例如,一個介面叫削水果兩個類叫 菜刀 和 日本刀,都實現削水果介面兩個類的削水果實現都是削皮削皮的實現是完全一樣的,代碼copy-paste,這違反了DRY原則。怎麼解決這個問題呢?
所以最終就會有
水果(蘋果,西瓜)刀(菜刀,日本刀)和削(削人棍,扒皮)三類組件,而不是你想的兩類。合起來就是武道館 fuck = 削人棍武道館.Instance;
刀法 shit= fuck.培訓();
shit.使用(new 西瓜, new 菜刀);
你以為菜刀和日本刀削皮的方法一樣嗎?
方案一
考慮定義一個叫「刀」的父類,實現削水果那個介面,實現那個方法。這倆刀從刀那邊繼承。
方案二定義一個名叫刀的介面,倆刀實現刀介面,不實現削水果介面。定義一個「削水果機」類,包含一個刀介面的對象,實現削水果介面,實現裡面,調用刀介面提供的方法,實現削水果功能。介面一般是具有某種功能(動態特徵)的載體,而介面的實現對象在類別上一般不屬於同類。比如,
彈簧和你褲襠里的東西 可以抽象為一個具有可伸縮功能的介面。如 java中 把具有可關閉功能的對象(輸入、輸出流,資料庫連接等)抽象為java.io.Closeable 介面 ;把可用於線程執行的任務抽象成 java.lang.Runnable 介面。
對於菜刀和西瓜刀,它們屬於相同的屬類,除了具有共性的動態特徵(方法 :切東西),還具有共性的靜態特徵(屬性:製作的材料等)在代碼中一般用抽象類表達。你這 「削水果" 顯然不是介面。
介面表示的往往是一個謂語。
典型的介面比如:start stop modify create add update modify你這個一定是 削 介面然後調用的時候傳入的是水果這個類。這是一。然後,菜刀和武士刀,都是刀啊,你需要一個父類。
實現的時候,削由父類實現。。。。這是二。所以你的建模是錯的。
最後。輪子哥說的對。聽他的。應該可以用策略模式吧,將削皮方法的實現封裝為函數對象
輪子哥說的的確到位
為什麼不用一個抽象介面 刀 來設計呢
推薦閱讀:
※設計模式在實際開發中用的多嗎?
※設計模式之組合模式
※設計模式之工廠模式
※PyQt信號槽的Python實現
※Design Pattern 劃分方式是對設計的邏輯思考