《游戲編程模式》筆記——組件模式
意圖
允許單一的實(shí)體跨越多個領(lǐng)域而不會導(dǎo)致這些領(lǐng)域彼此耦合。
模式
單一實(shí)體跨越了多個領(lǐng)域。為了保持領(lǐng)域之間相互分離,將每部分代碼放入各自的組件類中。實(shí)體被簡化為組件的容器。
何時使用
有一個涉及了多個領(lǐng)域的類,而你想保持這些領(lǐng)域相互隔離。
一個類正在變大而且越來越難以使用。
想要能定義一系列分享不同能力的類,但是使用繼承無法讓你精確選取重要的部分。
設(shè)計(jì)決策
對象如何獲取組件?
如果對象創(chuàng)建組件:
可以保證對象總是能拿到需要的組件,但是重新設(shè)置對象會比較困難。組件模式的強(qiáng)力特性之一就是只需要重新組合組件就可以創(chuàng)建新的對象,如果對象總是硬編碼組裝自己,我們就無法利用這個特性。
如果外部代碼提供組件:
對象更靈活。我們可以提供不同的組件,從而改變對象的行為。通過共用組件,對象變成了組件容器,我們可以為不同目的一遍又一遍的重用它。
對象可以與具體的組件類型解耦,對象只需要知道組件接口而不需要知道具體類型。
組件之間如何通信?
通過修改容器對象的狀態(tài):
這樣做可以保持組件解耦。
但是需要將組件分享的任何數(shù)據(jù)存儲在容器類中。通常狀態(tài)只在幾個組件間共享。
組件的通信也會基于組件的運(yùn)行順序,這需要我們小心的排列各種組件的操作保證運(yùn)行時能達(dá)到想要的效果。
組件之間相互引用:
思路是組件持有要交流的組件的引用,不通過容器類直接進(jìn)行交流。
雖然簡單快捷,但是讓組件之間綁在了一起。
通過發(fā)送消息:
最復(fù)雜的選項(xiàng)。在容器類中建立消息系統(tǒng),允許組件相互發(fā)送消息。
好處是同級組件可以解耦,容器類也變的簡單。
Unity的各種組件就是完全根據(jù)組件模式的原則進(jìn)行的設(shè)計(jì)。
組件模式與策略模式類似。都是將對象的行為取出,劃入單獨(dú)的重述對象。區(qū)別是,策略模式通常是無狀態(tài)的,僅封裝了算法而沒有數(shù)據(jù)。定義了對象如何行動,沒有定義對象是什么。
組件更加重要。組件經(jīng)常保存對象的狀態(tài),有助于確定其真實(shí)身份。有些組件也可能沒有任何狀態(tài)。在這種情況下,可以在不同的容器對象中使用相同的組件實(shí)例。這么看來,它的行為確實(shí)更像一種策略。
參考
《游戲編程模式》
《游戲編程模式》筆記——組件模式的評論 (共 條)
