【設計模式與遊戲完美開發】代理模式

代理模式 和 裝飾器十分類似, 以如下圖解釋說明區別。

裝飾者在之前介紹裝飾模式的時候就說明了它是在被裝飾者的功能基礎上,附加新的功能,而且被裝飾者的接口必定會被調用的情況下才選用裝飾模式來解決問題;

而代理者是先判斷是否需要執行被代理者的功能,如果不需要執行被代理者功能,那麼就執行代理者自身的功能,如果需要,那就執行被代理者的功能。

仔細地閱讀上面兩句話可以發現細微的差別,雖然看上面兩個圖可能有點懵逼,下面解釋下上面兩張圖。

黑色箭頭代表繼承關係,如裝飾者C繼承於基類A,擁有被裝飾者B對象,但是!!這個對象是用A來保存的!

即 A  b = new B();  這樣!!!這樣的好處是限制被裝飾者能被調用的接口,什麼叫限制被調用的接口???

例如:A中只有接口Play();     B實現了基類(A類)唯一一個Play()接口 ,但是B還有別的接口,如:ShowB();

此時因爲A b = new B() 是用 A類對象來保存的,所以只能調用A的接口Play(),而無法調用ShowB(),如果你想調用ShowB()就必須通過轉換成B類對象保存纔可以! 即(B b = new B();  b.ShowB() ;)

所以標準的裝飾者模式是要以基類來保存被裝飾者進行這樣的一個約束,上面只是舉了一個很簡單的例子,假如一個A類有3個接口,B類額外多了20多個接口,這樣可能會增多犯錯的機會,而不方便程序通過強大的編譯器功能尋找所需的被裝飾者接口,反而會提高風險。

另一方面,代理者是直接獲取被代理者對象,用的是B b  = new B()的形式保存,因爲代理者實際上是面向實現的,它要具體地爲某個類進行代理,實際你也可以改成裝飾者那種保存模式,設計模式本來就是可以修改的,在書中作者也明確說了,只要是能夠很好地解決當前項目問題的,能減少耦合,方便後續維護的都是一種“設計模式”,所以真正的區別是代理者並不是必定會調用被代理者功能,而是選擇需要時才調用,不需要時就進行代理者自身的功能。

(PS:白色箭頭是指引用對象,指向的就是引用的對象類)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章