實際實際上建立在乙個善意的謊言之上。當客戶向我們要求乙個物件的時候,我們的確將乙個物件返回給客戶。然而我們返回的物件卻不是客戶要求的那個物件,我們所返回的物件雖然在行為上和客戶要求的一樣,但是那個物件實際上只是乙個替身。這個冒充的物件稱作**
**的內部隱藏著乙個指向真實物件的引用。當客戶呼叫**的方法時,這個**就將請求**給真實物件。 -------《ruby 設計模式》
一下情形都可以使用**模式,另外,本文最後,我們看看ruby實現**模式是何其簡潔!
例1:**的基本實現方法
#銀行賬戶類
class bankaccount
attr_accessor :balance
def initialize(starting_blance=0)
@balance=starting_blance
enddef deposit(amount)
@balance+=amount
enddef withdraw(amount)
@balance-=amount
endend
#銀行賬戶**類
class bankaccounthandle
def initialize(real_object)
@real_object=real_object
enddef deposit(amount)
@real_object.deposit(amount)
enddef balance
@real_object.balance
endend
表面上看,**類只是封裝了真實物件,有點多此一舉,但事實並非如此,當我們需要對真實的銀行賬戶物件新增一些安全控制的時候,顯然只需要在**類裡面新增部分**即可。雖然這些訪問控制也可以在原來的銀行賬戶類裡面做,但這將可變與不變的部分交織在了一起,不符合設計模式的基本原則。
例2:有時我們已經有了乙個設計好的類,但我們需要把它放入另外乙個工程中直接使用,而不是從造車輪,那麼**模式顯然派上了用場。只需將原有類的乙個物件作為當前專案類的乙個成員變數即可。剩下的封裝函式你也應該知道怎麼做了
例3:**可以將物件的建立推遲到最後,我們有時並不需要一開始就建立一大堆物件,我們想用到的時候再說吧。那麼用**模式就很容易實現。
例如重寫上面的bankaccounthandle
class bankaccounthandle
def initialize(starting_balance=0)
@balance=starting_balance
enddef deposit(amount)
s=subject
return s.deposit(amount)
enddef subject
return @subject || (@subject=bankaccount.new( balance ))
endend
例4:利用ruby的method_missing方法實現**的簡潔版
重寫上面的bankaccounthandle
class bankaccounthandle
def initialize(real_object)
@real_object=real_object
enddef method_missing(name,*args)
@real_object.send(name,*args) #來啥方法呼叫啥方法,不需要乙個挨乙個的寫real_object的各個方法
endend
策略模式:
模板方法:
常見的幾種設計模式
保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點 public class lazyman2 提供對外方法 public static lazyman2 getinstance return singleton 使用乙個工廠類來專門生產物件,使用者只是關心產品,不用關心建立過程 public ...
常見的幾種JavaScript設計模式
設計模式是在軟體開發中,經過驗證的,用於解決在特定環境下,重複出現的特定的問題的解決方案。在編寫js 的過程中,運用一定的設計模式可以讓我們的 更加優雅 靈活。每個設計模式的構成如下 1 模式名稱 模式的乙個好記的名字 2 環境和問題 描述在什麼環境下,出現什麼特定的問題 3 解決方案 描述如何解決...
比較常見的幾種設計模式
第一種設計模式 單例模式 解釋 乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。但是在js中沒有類這個概念,所以我們要通過一些別的手段來實現單例。優點 1 在記憶體裡只有乙個例項,減少了記憶體的開銷,尤其...