設計模式習題

月亮熊發表於2024-04-23

物件導向設計原則

1.配置檔案可以不修改原始碼就更換驅動程式---開閉原則----------功能需求變化了,需求擴充套件,不改程式碼
2.A是B父類。C定義了A的物件obj為C的成員變數,C裡還有一個setA的方法給obj變數賦值----里氏替換原則----透過父類的物件呼叫子類方法,可以替換父類
3.子類有新方法父類沒有,父類變數去呼叫子類方法時,如果呼叫子類擴充套件的方法會報錯---里氏替換原則---透明替換就是不報錯
4.針對介面而非實現程式設計--針對抽象而非具體類程式設計---開閉原則
5.優先使用聚合組合而非繼承,更加靈活容易擴充套件--合成複用原則
6. 高層不應該依賴於低層(抽象層,實現層),低層/實現應該依賴高層/抽象
7.開閉原則是可複用的基礎--extension,modification
8.里氏替換原則---base class object , subclass object
9.依賴倒轉原則---abstraction, implementation
10.繼承複用和組合複用----繼承複用,子類可以繼承父類方法屬性,而且可以選擇性繼承;-----繼承複用會打破系統封裝性因為父類都曝光在子類面前----合成複用,聚合,組合關係是將一個類的物件作為另一個類的成員變數(可以呼叫其方法)/成為新物件的一部分------合成複用是黑箱複用,因為沒有暴露內部內容
11.應該著重針對抽象程式設計-----依賴倒轉原則---因此說依賴關係集中於抽象類就是符合原則的
12.DB為連結資料庫類,DAO為運算元據庫內容類。二者關係應該是關聯還是繼承?---關聯Association----合成複用原則
13.每個客戶端需要一個更小的介面,只需要與之相關的方法---介面隔離原則---但並不是說只定義一個方法,而是需要的那些方法--應該說實現一個功能/代表一個角色
14.Demeter法則-----降低類之間的耦合度----不需要把類,函式設定為公有函式,毫無道理
15.Demeter法則的運用:客戶端透過第三方間接訪問遠端物件(代理模式)

建立設計模式

1.物件導向的模式優勢:可以複用成功的設計
2.簡單工廠模式-----根據引數不同返回不同類的例項/子類物件----靜態工廠方法(可以從static識別)---在簡單工廠模式中,工廠類負責建立具體產品的例項。這些具體產品類通常都實現了一個共同的介面或者繼承自一個抽象類。在這種情況下,抽象類或者介面定義了產品族的公共介面或行為。
選項 D 中提到了 Cipher 類中的 encrypt() 方法必須是一個抽象方法,這是錯誤的。在簡單工廠模式中,並不要求抽象產品類的所有方法都是抽象的。具體產品類可以有自己的實現邏輯,而不必全部依賴於抽象方法。因此,encrypt() 方法可以是一個具體的方法,用於實現加密邏輯,而不必要求它是一個抽象方法

3.工廠方法---------不如抽象工廠一般化和抽象化(越一般化越抽象化)
4.抽象工廠--多於一個產品族被使用---等級結構更加簡便,因為建立的模組比工廠方法少----增加產品族符合開閉原則,但增加等級結構不符合開閉原則,所以它不始終符合原則
5.一系列產品就是一個產品族---一個產品等級結構是一組有繼承關係的產品
6.一般不指明,預設工廠模式為工廠方法---方法不能改靜態,靜態方法不能修改子類---當工廠方法是例項方法時,它可以被子類重寫,從而允許每個具體的子類提供自己的工廠邏輯,以建立特定型別的產品。這種靈活性使得工廠方法模式更容易擴充套件和維護,因為它遵循了開閉原則,即對擴充套件開放,對修改關閉。如果工廠方法是靜態的,就無法實現這種靈活性,因為靜態方法不能被子類重寫
7.建造者模式將構建與設計剝離---客戶端不需知道建立細節----具體建造者之間沒有依賴關係
8.原型模式---原型模式透過建立一個原型物件,然後透過複製這個原型物件來建立更多相同型別的物件,從而指定要建立的物件型別----每個類都需要配置一個克隆方法----淺複製只複製考慮的物件,而不是它引用的物件,這意味著其中的成員物件不會被複制。----深複製也可以,但是需要寫複雜程式碼----如果一個類要支援克隆,它必須實現Cloneable介面-----在子類的clone()方法中,通常會呼叫super.clone()來獲得父類的淺複製,然後再根據需要修改或者新增新的屬性----通常,x.clone() != x,x.clone().getClass() == x.getClass()

9.單例模式適用---確保一個類只能建立唯一例項物件----可以被繼承---必須本身建立,必須開發給整個系統-----

相關文章