行爲模式---及--不變模式

行爲模式(Behavioral Pattern)是對在不一樣的對象之間劃分責任和算法的抽象化。行爲模式不單單是關於類和對象的,並且是關於它們之間的相互做用的。
行爲模式分爲類的行爲模式和對象的行爲模式兩種
1.類的行爲模式:類的行爲模式使用類繼承關係在幾個類之間分配行爲
2.對象的的行爲模式:對象的行爲模式則使用對象的聚合來分配行爲。
行爲模式包括:不變模式,策略模式,模版方法模式,觀察者模式,迭代子模式,責任鏈模式,命令模式,備忘錄模式,狀態模式,訪問者模式,解釋器模式,調停者模式等。
 
不變模式:
一個對象的狀態在對象被建立以後就再也不變化,這就是所謂的不蠻模式(Immutable Pattern)
 不變模式可加強對象的強壯性。它容許多個對象共享某一對象,下降了對該對象進行併發訪問時的同步化開銷。若是須要修改一個不變對象的狀態,那麼就須要創建一個新的同類型對象,並在建立時將這個新的狀態存儲在新的對象裏。
    不變模式只涉及到一個類 。一個類的內部狀態建立後,在整個生命期間都不會發生變化時,這樣的就類叫做不變類。這種使用不變類的作法叫作不變模式。
 
不變模式有兩種形式:一種是弱不變模式,另外一種是強不變模式
 
弱不變模式
一個類的實例狀態是不可變化的,可是這個類的子類的實例具備可能會變化 的狀態。這樣的類符合弱不變模式。要實現弱不模式,一個類必須知足下面條件:
1.所考慮的對象沒有任何方法會修改對象的狀態;這樣一來,當對象的構造將對象的狀態初始化以後,對象的狀態便再也不改變。
2.全部的屬性都應當是私有的。不要聲明任何公開的屬性,以防客戶端對象直接修改任何的內部狀態
3.這個對象所引用到的其它對象若是是可變對象的話,必須設法限制外界對這些可變對象的訪問,以防止外界修改這些對象。若是可能,應當儘可能在不變對象內部初始化這些被引用到的對象,而不是在客戶端初始化,而後再傳入到不變對象內部來。若是某個可變對象必須在客戶端初始化,而後再傳入到不變對象裏的話,就應當考慮在不變對象初始化的時候,將這個可變對象複製一份,而不是使用原來的拷貝。
 
弱不變模式的缺點是:
1.一個弱不變對象的子對象能夠是可變對象
2.這個可變的子對象可能能夠修改父對象的狀態,從而可能會容許外界修改父對象的狀態
 
強不變模式
一個類的實例的狀態不會改變,同時它的子類的實例也具備不可變化的狀態。這樣的類符合強不變模式。要實例強不變模式,一個類必須首先知足弱不變模式所要求的全部條件,而且還知足下面條件之一:
1.所考慮的類全部的方法都應當是final:這樣這個類的子類不能置換掉此類的方法
2.這個類自己就是final的,那麼這個類就不可能會有子類,從而也就不可能有被子類修改的問題。
 
不變模式優勢:
1.不能修改一個不變對象的狀態,因此能夠避免由此引發的沒必要要的程序錯誤,換言之,一個不變的對象要比可變的對象更加容易維護
2.由於沒有任何一個線程可以修改不變對象的內部狀態,一個不變對象自動就是線程安全的,這樣就能夠省掉處理同步化的開銷。它能夠自由地被不一樣的客戶端共享
不變模式缺點:
一旦須要修改一個不變對象的狀態,就只好建立一個新的同類對象。在須要頻繁修改不變對象的環境裏,會有大量的不變對象做爲中間結果被建立出來,再被java語言的垃圾收集器收走。這是一種資源的浪費。
在設計任何一個類的時候,應當慎重考慮其狀態是否有須要變化的可能性。除非其狀態有變化的必要,否則應當將它設計成不變類。
相關文章
相關標籤/搜索