《大話設計模式》26種設計模式Java代碼整理(全)

26種設計模式大全(含java代碼)


/**
 * 適配器模式
 * 在計算機編程中,適配器模式(有時候也稱包裝樣式或者包裝)將一個類的接口適配成用戶所期待的。
 * 一個適配允許通常因爲接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。
 *
 */
 
 
 
 /**
 *  橋接模式
 *  在軟件系統中,某些類型由於自身的邏輯,它具有兩個或多個維度的變化,那麼如何應對這種“多維度的變化”?這就要使用橋接模式
 *
 */
 
 
 /**
 * 建造者模式 將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 
 * 1 builder:爲創建一個產品對象的各個部件指定抽象接口。
 * 2 ConcreteBuilder:實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並 提供一個檢索產品的接口。 3
 *    Director:構造一個使用Builder接口的對象。 4
 * Product:表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程
 * 包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
 */
 
 
 /*
 *
 * 命令模式 “行爲請求者”與“行爲實現者”通常呈現一種“緊耦合”。但在某些場合,比如要對行爲進行“記錄、撤銷/重做、事務”等處理,
 * 這種無法抵禦變化的緊耦合是不合適的。
 * 在這種情況下,如何將“行爲請求者”與“行爲實現者”解耦?將一組行爲抽象爲對象,實現二者之間的鬆耦合。這就是命令模式(Command Pattern)
 * 
 * 1.降低對象之間的耦合度。 2.新的命令可以很容易地加入到系統中。 3.可以比較容易地設計一個組合命令。 4.調用同一方法實現不同的功能
 * 
 */
 
 
 
 /*
 *
 * 組合模式 組合模式,將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。
 * 有時候又叫做部分-整體模式,
 * 它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程序可以像處理簡單元素一樣來處理複雜元素,從而使得客戶程序與複雜元素的內部結構解耦。
 * 組合模式讓你可以優化處理遞歸或分級數據結構
 * 。有許多關於分級數據結構的例子,使得組合模式非常有用武之地。關於分級數據結構的一個普遍性的例子是你每次使用電腦時所遇到的
 * :文件系統。文件系統由目錄和文件組成
 * 。每個目錄都可以裝內容。目錄的內容可以是文件,也可以是目錄。按照這種方式,計算機的文件系統就是以遞歸結構來組織的。如果你想要描述這樣的數據結構
 * ,那麼你可以使用組合模式Composite。
 */
 
 
 /**
 * 組合模式 組合模式,將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。
 * 有時候又叫做部分-整體模式,
 * 它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程序可以像處理簡單元素一樣來處理複雜元素,從而使得客戶程序與複雜元素的內部結構解耦。
 * 組合模式讓你可以優化處理遞歸或分級數據結構
 * 。有許多關於分級數據結構的例子,使得組合模式非常有用武之地。關於分級數據結構的一個普遍性的例子是你每次使用電腦時所遇到的
 * :文件系統。文件系統由目錄和文件組成
 * 。每個目錄都可以裝內容。目錄的內容可以是文件,也可以是目錄。按照這種方式,計算機的文件系統就是以遞歸結構來組織的。如果你想要描述這樣的數據結構
 * ,那麼你可以使用組合模式Composite。
 */
 
 
 
 /*
 *
 *裝飾模式
 *裝飾模式是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
 */
 
 
 
 /**
 * 解釋器模式 意圖:給定一個語言,定義它的文法表示,並定義一個解釋器,這個解釋器使用該標識來解釋語言中的句子。
 * 主要解決:對於一些固定文法構建一個解釋句子的解釋器。
 * 何時使用:如果一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述爲一個簡單語言中的句子
 * 。這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題。 如何解決:構件語法樹,定義終結符與非終結符。
 */
 
 
 
 /**
 * 解釋器模式 意圖:給定一個語言,定義它的文法表示,並定義一個解釋器,這個解釋器使用該標識來解釋語言中的句子。
 * 主要解決:對於一些固定文法構建一個解釋句子的解釋器。
 * 何時使用:如果一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述爲一個簡單語言中的句子
 * 。這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題。 如何解決:構件語法樹,定義終結符與非終結符。
 */
 
 
 /**
 * 外觀模式
 * 外觀模式(Facade),爲子系統中的一組接口提供一個一致的界面,定義一個高層接口,這個接口使得這一子系統更加容易使用。
 *
 */
 
 
 /**
 * 工廠模式 工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。
 * 著名的Jive論壇,就大量使用了工廠模式,工廠模式在Java程序系統可以說是隨處可見。因爲工廠模式就相當於創建實例對象的new,我們經常要根據類Class生成實例對象,如A
 * a=new A() 工廠模式也是用來創建實例對象的,所以以後new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,
 * 但會給你係統帶來更大的可擴展性和儘量少的修改量。
 */
 
 
 
 /**
 * 工廠模式 工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。著名的Jive論壇
 * ,就大量使用了工廠模式,工廠模式在Java程序系統可以說是隨處可見。因爲工廠模式就相當於創建實例對象的new,我們經常要根據類Class生成實例對象,如A
 * a=new A() 工廠模式也是用來創建實例對象的,所以以後new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,
 * 但會給你係統帶來更大的可擴展性和儘量少的修改量。
 */
 
 /**
 * 享元模式
 * 
 * 它使用共享物件,用來儘可能減少內存使用量以及分享資訊給儘可能多的相似物件;它適合用於只是因重複而導致使用無法令人接受的大量內存的大量物件。
 * 通常物件中的部分狀態是可以分享。常見做法是把它們放在外部數據結構,當需要使用時再將它們傳遞給享元。
 * 如果一個應用程序使用了大量的對象,而這些對象造成了很大的存儲開銷的時候就可以考慮是否可以使用享元模式。
 * 例如,如果發現某個對象的生成了大量細粒度的實例,並且這些實例除了幾個參數外基本是相同的
 * ,如果把那些共享參數移到類外面,在方法調用時將他們傳遞進來,就可以通過共享大幅度單個實例的數目。
 */
 
 
 /**
 * 責任鏈模式
 * 
 * 責任鏈模式是一種設計模式。在責任鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。
 * 發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
 * 
 */
 
 
 
 
 /**
 * 責任鏈模式
 * 
 * 責任鏈模式是一種設計模式。在責任鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。
 * 發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
 * 
 */
 
 
 
 /**
 * 中介者模式 Mediator模式也叫中介者模式,是由GoF提出的23種軟件設計模式的一種。Mediator模式是行爲模式之一,在Mediator模式中,
 * 類之間的交互行爲被統一放在Mediator的對象中,對象通過Mediator對象同其他對象交互,Mediator對象起着控制器的作用。
 * 
 */
 
 
 /**
 * 備忘錄模式 
 * 在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。
 */
 
 
 
 
 /**
 * 觀察者模式
 * 一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。
 * 此種模式通常被用來實現事件處理系統。
 */
 
 
 
 /**
 * 觀察者模式
 * 一個目標物件管理所有相依於它的觀察者物件,
 並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。
 * 此種模式通常被用來實現事件處理系統。
 */
 
 
 /**
 * 原型模式
 * 用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。
 */
 
 
 /**
 * 代理模式 
 * 真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。
 * (2).代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。 (3).高擴展性
 */
 
 
 
 
 /**
 * 抽象工廠模式 抽象工廠模式是所有形態的工廠模式中最爲抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。
 * 抽象工廠模式可以向客戶端提供一個接口
 * ,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據里氏替換原則,任何接受父類型的地方,都應當能夠接受子類型
 * 。因此,實際上系統所需要的,
 * 僅僅是類型與這些抽象產品角色相同的一些實例,而不是這些抽象產品的實例。換言之,也就是這些抽象產品的具體子類的實例。工廠類負責創建抽象產品的具體子類的實例。
 */
 
 
 
 
 /**
 * 抽象工廠模式 抽象工廠模式是所有形態的工廠模式中最爲抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。
 * 抽象工廠模式可以向客戶端提供一個接口
 * ,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據里氏替換原則,任何接受父類型的地方,都應當能夠接受子類型
 * 。因此,實際上系統所需要的,
 * 僅僅是類型與這些抽象產品角色相同的一些實例,而不是這些抽象產品的實例。換言之,也就是這些抽象產品的具體子類的實例。工廠類負責創建抽象產品的具體子類的實例。
 */
 
 
 
 /**
 * 單例模式
 *單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例
 */
 
 
 /**
 * 狀態模式
 * 狀態模式主要解決的是當控制一個對象狀態的條件表達式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。
 */
 
 
 
 /**
 *策略模式 
 *策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。
 */
 
 
 
 /**
 * 模板模式
 *  模板方法模式(Template Method
 * Pattern),定義一個操作中的算法骨架,而將一些實現步驟延遲到子類當中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。
 * 模板方法模式是比較簡單的一種設計模式
 * ,但是它卻是代碼複用的一項基本的技術,在類庫中尤其重要,它遵循“抽象類應當擁有儘可能多的行爲,應當擁有儘可能少的數據”的重構原則
 * 。作爲模板的方法要定義在父類中,在方法的定義中使用到抽象方法,而只看父類的抽象方法是根本不知道怎樣處理的,實際做具體處理的是子類,在子類中實現具體功能,
 * 因此不同的子類執行將會得出不同的實現結果,但是處理流程還是按照父類定製的方式。這就是模板方法的要義所在,制定算法骨架,讓子類具體實現。
 */
 
 
 
 
 /**
 * 訪問者模式
 * 
 * 1.Visitor 抽象訪問者角色,爲該對象結構中具體元素角色聲明一個訪問操作接口。該操作接口的名字和參數標識了發送訪問請求給具體訪問者的具體元素角色,
 * 這樣訪問者就可以通過該元素角色的特定接口直接訪問它。 2.ConcreteVisitor.具體訪問者角色,實現Visitor聲明的接口。
 * 3.Element 定義一個接受訪問操作(accept()),它以一個訪問者(Visitor)作爲參數。
 * 4.ConcreteElement具體元素,實現了抽象元素(Element)所定義的接受操作接口。
 * 5.ObjectStructure結構對象角色,這是使用訪問者模式必備的角色。它具備以下特性
 * 能枚舉它的元素;可以提供一個高層接口以允許訪問者訪問它的元素;如有需要,可以設計成一個複合對象或者一個聚集(如一個列表或無序集合)。
 * 
 * 1、 一個對象結構包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴於其具體類的操作。
 * 2、需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而你想避免讓這些操作“污染”這些對象的類。Visitor模式使得你可以將相關的操作集中起來定義在一個類中。 
 * 3、 當該對象結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。
 * 4、定義對象結構的類很少改變,但經常需要在此結構上定義新的操作
 * 。改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。如果對象結構類經常改變,那麼可能還是在這些類中定義這些操作較好。
 */
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章