模式與重構
設計模式總結-Visitor模式
摘要: Visitor模式的一個優點體現在對集合元素的訪問中:由于集合中的可訪問元素都實現了Visitable接口,所以在迭代集合的過程中,我們可以將每個元素都看成是接口類型。
其次由于JAVA語言的多態性,雖然每個元素都是接口類型(Visitable),但每個元素的實現類不同,所以在調用accept方法時,虛擬機“知道”應該調起那個正確的方法(例如:集合中的一個String元素,會調用StringElement的accept方法)
閱讀全文
posted @
2008-04-15 17:38 Paul Lin 閱讀(4476) |
評論 (2) 編輯
設計模式總結-Strategy模式
摘要: 策略操作定義了策略的輸入和輸出,而把策略的實現工作留給了各個類。這些類以不同的方案來實現同一操作,它們為用戶提供統一的接口,因而這些類可以相互替換。
Strategy模式允許多種策略共存,而代碼不會混亂。策略模式也可以實現模式選擇邏輯和策略本身相分離。
Strategy模式的意圖在于把可選的策略或方案封裝在不同的類中,并在這些類中實現一個共同的操作。
閱讀全文
posted @
2008-04-08 11:52 Paul Lin 閱讀(5359) |
評論 (2) 編輯
設計模式總結-State模式
摘要: 使用狀態模式后,客戶端外界可以直接使用事件Event實現,根本不必關心該事件導致如何狀態變化,這些是由狀態機等內部實現。這是一種Event-condition-State,狀態模式封裝了condition-State部分。
每個狀態形成一個子類,每個狀態只關心它的下一個可能狀態,從而無形中形成了狀態轉換的規則。如果新的狀態加入,只涉及它的前一個狀態修改和定義。
閱讀全文
posted @
2008-04-07 18:02 Paul Lin 閱讀(7615) |
評論 (2) 編輯
設計模式總結-Command模式
摘要: 讓方法運行最常見的方式是調用之,但是在很多情況下,我們不能控制和提供方法執行的上下文和時機。這種情況下,可以把方法封裝在對象中。通過在對象中存儲調用方法所需的信息,就可以讓客戶端或者服務決定何時調用這個方法。
Command模式的意圖是把請求封裝在對象中。
--摘自《Java設計模式》第24章:Command(命令)模式
閱讀全文
posted @
2008-04-07 15:13 Paul Lin 閱讀(3470) |
評論 (0) 編輯
設計模式總結-Memento模式(二)
摘要: Memento模式和其它模式的結合應用:
一、“Mementor”模式和“堆?!钡慕Y合-“GUI界面撤銷功能”的實現
二、“Mementor”模式和“Observer”模式的結合-“通知式恢復”
三、“Mementor”模式和“Observer”模式、“責任鏈”模式的結合-“鏈式通知恢復”
四、“Mementor”模式和“Flyweight”模式的結合:減少相同對象的拷貝
閱讀全文
posted @
2008-03-22 17:59 Paul Lin 閱讀(1737) |
評論 (1) 編輯
設計模式總結-Memento模式(一)
摘要: Memento模式的特點:
在需要提供保存、恢復對象狀態的類中,必須提供兩個方法:
.保存對象當前狀態方法:將對象自身(this)作為參數傳入,創建備忘錄。
.恢復對象之前狀態的方法:取出備忘錄/接收一個備忘錄對象,從中獲取對象之前的狀態
模式的缺點是耗費大,如果內部狀態很多,再保存一份,無意要浪費大量內存.
注意:Memento模式保存的是操作前對象的狀態,而不是操作后對象的狀態;否則就沒辦法做恢復了
閱讀全文
posted @
2008-03-22 17:56 Paul Lin 閱讀(2205) |
評論 (0) 編輯
設計模式總結-Observer模式
摘要: 下面是Observer模式的實現過程:
·創建一個被觀察者,繼承java.util.Observable
·創建一個觀察者,實現java.util.Observer接口
·注冊觀察著,調用addObserver(Observer observer)
·在被觀察者改變對象內部狀態的地方,調用setChanged()方法,然后調用notifyObservers(Object)方法,通知被觀察者
·在觀察者的update(Object)方法中,對改變做出響應。
閱讀全文
posted @
2008-03-07 13:55 Paul Lin 閱讀(3083) |
評論 (0) 編輯
設計模式總結-Flyweight模式
摘要: Flyweight模式一般由幾個部分組成:
·Flyweight接口(抽象類) :定義了一個可共享的元類
·Flyweight實現類:實現了元類中的操作,而且可能會提供一個用于保存內部狀態(共享屬性)的空間
·Flyweight Factory:創建Flyweight的工廠類,創建后將其保存到Flyweight Pool中
·Flyweight Pool:緩沖Flyweight對象的池,通常包含在工廠類中
閱讀全文
posted @
2008-03-05 14:33 Paul Lin 閱讀(2978) |
評論 (0) 編輯
設計模式總結-Bridge模式
摘要: ·在抽象接口中包含了一個對行為接口的引用,這樣的話行為的操作將完全委托給行為接口完成,抽象類無需關心。
·在抽象類的繼承子類中,調用了行為類的子類來實現不同的行為。此時抽象類的子類中只知道屬性,但不知道具體的行為實現,實現了概念與行為的分離
·在行為類的繼承子類中,只知道執行相應的動作,但不知道具體的屬性,實現了行為和概念的分離
閱讀全文
posted @
2008-02-26 21:48 Paul Lin 閱讀(2082) |
評論 (0) 編輯
設計模式總結-Decorator模式(二)
摘要: Decorator模式的實際應用--動態黑名單過濾
閱讀全文
posted @
2008-02-19 18:31 Paul Lin 閱讀(1773) |
評論 (0) 編輯
設計模式總結-Decorator模式
摘要: Decrator模式的適用場合:
1).在運行時刻由用戶動態決定加入的方式和時機,無法在編譯期間決定
2).需要改變的行為太多,用繼承會導致復雜性的增加
閱讀全文
posted @
2008-02-19 16:33 Paul Lin 閱讀(2091) |
評論 (0) 編輯
設計模式總結-Composite模式(一)
摘要: Composite模式的特點:
·Composite模式一般都有一個抽象類或接口來表示最基本的構件。
·Composite模式一般都由兩類對象構成:表示單個元素的對象(Primitive)和表示多個元素組合的對象(Composite)
·Composite模式下Primitive和Composite對象都繼承或實現上層接口或父類
·Composite模式下每個構件都含有三個基礎方法:add(構件)、remove(構件)、iterator()
·Composite對象含有一個用來保存其下所有基礎元素的的集合,例如:Vector,ArrayList,HashMap
·Composite對象的方法被調用時一般都會引起其下所有基礎元素相同方法的調用,即遞歸調用。
閱讀全文
posted @
2008-01-21 09:55 Paul Lin 閱讀(3136) |
評論 (0) 編輯
設計模式總結-Adapter模式
摘要: 從上面的四種方式來看,方式二最簡單也最常用,方式三最靈活,方式一和四有相同的地方就是都繼承了其中的某一個類,這樣就限制了適配器的子類不能再繼承其它的功能父類了,不同的地方是方式一使用委托的方式來完成類B的功能,而方式四則自己實現了接口的方法。
閱讀全文
posted @
2008-01-14 17:50 Paul Lin 閱讀(1440) |
評論 (0) 編輯
設計模式總結-Proxy模式
摘要: Proxy類具有幾個特點
·Proxy類一般都實現或繼承了后臺對象接口或抽象類,在其中實現了后臺對象接口的方法,這樣外界和代理類打交道的客戶端看到的是和后臺對象一樣的接口。根本不知道自己在和代理對象打交道。
·Proxy類一般都含有一個后臺對象作為其成員,因為代理類需要在其實現接口的方法中調用后臺對象的真正方法來實現業務邏輯。
·Proxy類一般都需要包含一個能夠驗證用戶請求是否合法的對象,如上例中的ForumPermisssions類,作為轉發或拒絕用戶請求的判斷依據
閱讀全文
posted @
2008-01-14 17:40 Paul Lin 閱讀(1506) |
評論 (0) 編輯
設計模式總結-單例模式
摘要: 在多線程環境下,我們無法保證一個方法能夠持續運行到結束,其他線程的方法才開始運行。因而可能存在這樣一種情形:兩個線程幾乎同時嘗試初始化單例類。假設第一個方法發現單例為空,而第二個方法在此刻開始運行,它也會發現該單例為空。接下來,這兩個方法都將對該單例進行初始化
閱讀全文
posted @
2008-01-03 22:31 Paul Lin 閱讀(1223) |
評論 (0) 編輯
Full 模式與重構 Archive