隨着面向對象技術的發展和普遍應用,設計模式已經普遍的應用於面向對象系統的設計和開發,成爲面向對象技術的一個重要組成部分。設計模式被定義爲是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結。程序員們使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。在我看來其實軟件設計模式就是由前人所總結出來的在特定的狀況下用來解決實際問題一套解決方案。程序員
一般根據目的(即模式是用來作什麼的)將23種設計模式分爲3類:算法
工廠方法模式(Factory Method)、抽象工廠模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)和單例模式(Singleton)。設計模式
適配器模式(Adapter)、橋接模式(Bridge)、組合模式(Composite)、裝飾模式(Decorator)、外觀模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。數據結構
- 行爲型模式(用於描述類或對象怎樣交互和怎樣分配職責):
職責鏈模式(Chain of Responsibility)、命令模式(Command)、解釋器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、備忘錄模式(Memento)、觀察者模式(Observer)、狀態模式(State)、策略模式(Strategy)、模板方法模式(Template Method)和訪問者模式(Visitor)。框架
【建立型模式】:關注對象的建立過程,將對象的建立和使用分離,使用對象時無需知道對象建立細節,使得相同的建立過程能夠屢次複用。使整個系統的設計更加符合單一職責原則。函數
工廠方法模式單元測試
- 結構:抽象產品(Product)、具體產品(ConcreteProduct)、抽象工廠(Factory)、具體工廠(ConcreteProduct)。
- 定義:工廠父類負責定義建立產品對象的公共接口,而工廠子類則負責生成具體的產品對象,將產品類的實例化操做延遲到工廠子類中完成,從而在必定程度上知足「開閉原則」。
- 適用環境:
a) 一個類不知道它說須要的對象的具體的類測試
b) 一個類經過其子類來指定建立哪一個對象ui
c)將建立對象的任務委託給多個工廠子類中的某一個設計
抽象工廠模式
- 結構:抽象工廠(AbstractFactory)、具體工廠(ConcreteFactory)、抽象產品(AbstractProduct)、具體產品(ConcreteFactory)
- 定義:提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
- 使用環境:
a) 一個系統不該當依賴於產品類實例如何被建立、組合和表達的細節
b) 系統中有多於一個的建立對象的工廠
c)屬於同一個工廠的產品將在一塊兒使用
d) 系統提供一個產品類的庫,全部產品以一樣的接口出現,從而使客戶端不依賴於具體實現。
建造者模式
- 結構:抽象建造者(Builder)、具體建造者(ConcreteBuilder)、產品角色(Product)、指揮者(Director)。
- 定義:該模式提供了一個統一的抽象的實現父類(抽象建造者),該父類只提供模塊的抽象方法,具體的實現子類(具體建造者)就繼承該類並用本身的方式實現父類中的方法,而後再由一個指揮者來指定採起哪一種組合的方式。側重於一步步構造一個複雜對象,返回一個完整對象。
- 適用環境:
a)須要生成的產品對象有複雜的內部結構,對象一般包含多個成員屬性
b) 須要生成的對象屬性相互依賴,須要指定其生成順序
c) 對象的建立過程獨立於建立該對象的類
d) 隔離複雜對象的建立和使用,使相同的建立過程建立出不一樣的對象
原型模式
- 結構:抽象原型類(Prototype)、具體原型類(ConcretePrototype)、客戶類(Client)。
- 定義:提供一個抽象父類,父類中提供一個克隆方法,子類繼承父類,並實現父類中的克隆方法。用原型實例指定建立對象的種類,並經過複製原型建立新的對象。
- 適用環境:
a) 建立新對象成本較大
b)系統須要保存對象的狀態,同時對象狀態變化很小
c)須要避免使用分層次的工廠類來建立對象,同時類的實例對象只有一個或不多的幾個組合狀態
單例模式
- 結構:單例角色(Singleton)
- 定義:定義一個單例類,設計構造函數爲私有,內部實現只生成一個實例,同時提供一個靜態的方法讓客戶可使用這個惟一實例。
- 適用環境:
a) 系統只須要一個實例化對象
b) 客戶調用類的單例只容許使用一個公共訪問點
【結構型模式】:關注如何將現有類或現有對象組織在一塊兒造成強大的結構,根據「合成複用原則」,大多使用關聯關係來代替繼承關係。
適配器模式
- 結構:目標抽象類(Target)、適配器類(Adapter)、適配器者(Adaptee)、客戶類(Client)。
- 定義:使接口不兼容的類能夠一塊兒工做,在中間起到一個接口轉換的工做。
- 適用環境:
a)系統須要使用現有的類,但現有類的接口不符合系統須要
b) 要創建一個能夠重複工做的類,用於與一些彼此之間沒有太大關聯的一些類。
橋接模式
- 結構:抽象類(Abstraction)、擴充抽象類(RefinedAbstraction)、實現類接口(Implementor)、具體實現類(ConcreteImplementor)。
- 定義:將抽象與實現分離,二者均可以獨立的變化,下降類與類之間的耦合,減小代碼編寫量。
- 適用環境:
a)一個類存在兩個獨立變化的維度
b)不但願使用繼承或由於繼承致使系統類個數增長的系統
組合模式
- 結構:抽象構件(Component)、葉子構件(Leaf)、容器構件(Composite)、客戶類(Client)。
- 定義:組合多個對象用來描述總體與部分之間的關係。
- 適用環境:
a)須要表示一個對象總體或部分層次
b) 對象的結構時動態的且複雜程度不同,但客戶須要一致地處理它們
裝飾模式
- 結構:抽象構件(Component)、具體構件(ConcreteComponent)、抽象裝飾類(Decorator)、具體裝飾類(ConcreteDecorator)
- 定義:經過爲抽象裝飾類添加具體的裝飾內容實現動態的給一個對象增長一些額外的職責。
- 適用環境:
a)在不影響其餘對象的狀況下,以動態、透明的方式給單個對象添加職責
b)須要動態地給一個對象增長功能。
外觀模式
- 結構:外觀角色(Facade)、子系統角色(SubSystem)
- 定義:將一個系統中的各類方法統一封裝到一個類中,經過此類的實現外界與系統的交互。
- 適用環境:
a) 當要爲一個複雜子系統提供一個簡單接口時
b) 客戶程序與多個子系統之間存在很大依賴性
享元模式
- 結構:抽象享元類(Flyweight)、具體享元類(ConcreteFlyweight)、非共享具體享元類(UnsharedConcreteFlyweight)、享元工廠類(FlyweightFactory)。
- 定義:利用共享技術支持對象的複用。系統使用少許的對象。
- 適用環境:
a) 一個系統有大量相同或類似的對象
b) 對象大部分狀態均可之外部化,能夠將內部狀態傳入對象
代理模式
- 結構:抽象主題角色(Subject)、代理主題角色(Proxy)、真實主題角色(RealSubject)。
- 定義:給一個對象提供一個代理,經過代理對象訪問另外一個對象。
- 適用環境:遠程代理、虛擬代理、Copy-on-Write代理等
【行爲型模式】:關注對象之間的交互。
職責鏈模式
- 結構:抽象處理者(Handler)、具體處理者(ConcreteHandler)、客戶類(Client)。
- 定義:避免請求的發送方和接受方耦合在一塊兒,讓多個對象都有可能接受請求
- 適用環境:
a) 有多個對象能夠處理同一個請求
b)在不明確接受者的狀況下,向多個對象中的一個提交一個請求
c) 可動態指定一組對象處理請求
命令模式
1.結構:抽象命令類(Command)、具體命令類(ConcreteCommand)、調用者(Invoker)、接受者(Receiver)、客戶類(Client)
2.定義:將一個請求的實現、發起、響應的過程分別封裝,下降了系統之間的耦合度。
3.適用環境:
a) 系統須要在不一樣的時間指定請求、將請求排隊和執行請求。
b) 系統須要支持命令的撤銷操做和恢復撤銷操做
c) 系統須要將一組操做組合在一塊兒,即支持宏命令
解釋器模式
- 結構:抽象表達式(AbstractExpression)、終結符表達式(TerminalExpression)、非終結符表達式(NonterminalExpression)、環境類(Context)、客戶類(Client)
- 定義:定義語言的文法,並創建一個解釋器來解釋語言中的句子。
- 適用環境:
a) 文法較爲簡單的
b)一些重複出現的問題能夠用一種簡單的語言來進行表達
迭代器模式
- 結構:抽象迭代器(Iterator)、具體迭代器(ConcreteIterator)、抽象聚合類(Aggregate)、具體聚合類(ConcreteAggregate)。
- 定義:提供一種方法來訪問聚合對象、而不用暴露這個對象的內部表示,別名爲遊標。
- 適用環境:
a) 訪問一個聚合對象的內容而無需暴露其內部表示
b) 須要爲聚合對象提供多種遍歷方式
c) 爲遍歷不一樣的組合結構提供一個統一的接口
中介者模式
- 結構:抽象中介者(Mediator)、具體中介者(ConcreteMediator)、抽象同事類(Colleague)、具體同事類(ConcreteColleague)。
- 定義:對象與對象之間的交互不直接進行,而是經過中介者來實現交互。中介者將對象之間的交互抽取出來,大大減小對象間的關係數量。
- 適用環境:
a) 系統中對象之間存在複雜的引用關係
b) 一個對象因爲引入其餘不少對象而且直接和這些對象通訊,致使難以複用該對象。
備忘錄模式
- 結構:原發器(Originator)、備忘錄(Memento)、負責人(Caretaker)
- 定義:獲取一個對象的內部狀態,並在該對象以外保存該狀態,這樣能夠在之後將對象恢復到原先保存的狀態。
- 適用環境:
a)保存一個對象在某一個時刻的狀態或部分狀態
觀察者模式
- 結構:目標(Subject)、具體目標(ConcreteSubject)、觀察者(Observer)、具體觀察者(ConcreteObserver)。
- 定義:多個對象依賴於一個目標對象,當該目標對象發生改變時,多個對象也會隨之發生改變。
- 適用環境:
b) 一個抽象模型有兩個方面,其中一個方面依賴與另外一個方面。
c) 一個對象的改變致使其餘一個或多個對象也發生改變
狀態模式
- 結構:環境類(Context)、抽象狀態類(State)、具體抽象類(ConcreteState).
- 定義:容許一個對象在其內部狀態改變時而改變它的行爲,使得對象看起來彷佛修改了它的類。
- 適用環境:
a) 對象的行爲依賴於它的狀態而且能夠根據它的狀態改變而改變它的相關行爲。
策略模式
- 結構:境類(Context)、抽象策略類(Strategy)、具體策略類(ConcreteStrategy)
- 定義:實現目的的方法有多種,將每一種方法封裝成一個類,它們繼承同一個父類,在須要時能夠相互替換。
- 適用環境:
b) 不但願客戶端知道複雜的、與算法相關的數據結構,在具體策略類中封裝算法和相關數據結構。
模板方法模式
- 結構:抽象類(AbstractClass)、具體子類(ConcreteClass)
- 定義:不改變算法的結構就能夠重定義該算法的某些特定步驟。
- 適用環境:
a)框架設計
b)單元測試JUnit的TestCase
訪問者模式
- 結構:抽象訪問者(Vistor)、具體訪問者(ConcreteVisitor)、抽象元素(Element)、具體元素(ConcreteElement)。
- 定義:將一個對象中的每個元素抽取出來,單獨的做爲一個類,並繼承一個公共的父類,而後定義一個抽象的操做,提供對每個元素的操做方法,在子類中實現具體的操做方法,這樣就能在不改變元素類的前提下,經過添加新的操做方法子類實現對元素的新的操做。
- 適用環境:
a) 一個對象結構包含不少類型的對象,但願對這些對象實施一些依賴其具體類型的操做。
b)對象結構中對象對應的類不多改變,但常常須要在此對象結構上定義新的操做。