?專欄:《Java面向對象程序設計》學習筆記
第 8 章 設計模式
一個好的設計系統往往是易維護、易擴展、易復用的。
8.1 設計模式簡介
8.1.1 什么是設計模式
一個設計模式 (pattern) 是針對某一類問題的最佳解決方案,而且己經被成功應用于許多系統的設計中。
即一個設計模式是從許多優秀的軟件系統中總結出的成功的可復用的設計方案。
8.1.3 什么是框架
框架不是設計模式,框架是針對某個領域,提供用于開發應用系統的類的集合。
8.2 策略模式
策略模式:定義一系列算法,把它們一個個封裝起來,并且使它們可相互替換。
本模式使得算法可獨立于使用它的客戶而變化。
8.2.1 策略模式的結構
-
策略 (Strategy) :策略是一個接口,該接口定義若干個算法標識,即定義了若干個抽象方法。
-
上下文 (Context) :上下文是依賴于策略接口的類(是面向策略設計的類)。
-
具體策略(ConcreteStrategy):具體策略是實現策略接口的類。
8.2.3 策略模式的優點
-
上下文( context )和具體策略( ConcreteStrategy )是松耦合關系。
-
策略模式滿足“開-閉”原則,當增加新的具體策略時,不需要修改上下文類的代碼,上下文就可以引用新的具體策略的實例。
8.2.4 適合使用策略模式的情景
-
一個類定義了多種行為,并且這些行為在這個類的方法中以多個條件語句的形式出現,那么可以使用策略模式避免在類中使用大量的條件語句。
-
程序的主要類(相當于上下文角色)不希望暴露復雜的、與算法相關的數據結構,那么可以使用策略模式封裝算法,即將算法分別封裝到具體策略中。
-
需要使用一個算法的不同變體。
8.3 訪問者模式
表示一個作用于某對象結構中的各個元素的操作。
它使得用戶可以在不改變各個元素的類的前提下定義作用于這些元素的新操作。
8.3.2 訪問者模式的使用
可以將這些類看作是一個小框架,用戶就可以使用這個小框架中的類編寫應用程序了。
8.3.3 雙重分派
訪問者模式使用了一種稱為“雙重分派”的技術:在訪問者模式中,
-
被訪問者, 即EIement 元素角色element ,首先調用 accept (Visitor visitor )方法接收訪問者,
-
被接收的訪問者 visitor 再調用 visit(EIement element) 方法訪問當前 element 對象。
“雙重分派”技術中的核心是將數據的存儲和操作解除耦合。
8.3.4 訪問者模式的優點
( 1 )在不改變一個集合中的元素的類的情況下,增加新的施加于該元素上的新操作。
( 2 )可以將集合中各元素的某些操作集中到訪問者中,不僅便于集合的維護,也有利于集合中元素的復用。
8.3.5 適合使用訪問者模式的情景
( 1 )在一個對象結構中,例如某個集合中,包含很多對象,想對集合中的對象增加一些新的操作。
( 2 )需要對集合中的對象進行很多不同的并且不相關的操作,而我們又不想修改對象的類,此時就可以使用訪問者模式。訪問者模式可以在 Visitor 類中集中定義一些關于集合中對象的操作。
8.4 裝飾模式
裝飾模式:動態地給對象添加一些額外的職責。就功能來說,裝飾模式相比生成子類更為靈活。
裝飾模式是動態地擴展一個對象的功能,而不需要改變原始類代碼的一種成熟模式。
8.4.2 裝飾模式的使用
使用模式給出了可以使用的類,可以將這些類看作是一個小框架,用戶就可以使用這個小框架中的類編寫應用程序。
8.4.4 裝飾模式相對繼承機制的優勢
減少子類數目,有利于系統的維護。
8.4.5 裝飾模式的優點
-
被裝飾者和裝飾者是松耦合關系。
由于裝飾 (Decorator) 僅僅依賴于抽象組件( Component ),因此具體裝飾只知道它要裝飾的對象是抽象組件的某一個子類的實例,但不需要知道是哪一個具體子類。
-
裝飾模式滿足“開一閉原則”,不必修改具體組件,就可以增加新的針對該具體組件的具體裝飾。
8.4.6 適合使用裝飾模式的情景
( 1 )程序希望動態地增強類的某個對象的功能,而又不影響該類的其他對象。
( 2 )采用繼承來增強對象功能不利于系統的擴展和維護。