少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          狀態(tài)模式(state pattern)和策略模式(strategy pattern)的實現(xiàn)方法非常類似,都是利用多態(tài)把一些操作分配到一組相關(guān)的簡單的類中,因此很多人認(rèn)為這兩種模式實際上是相同的。然而
          •在現(xiàn)實世界中,策略(如促銷一種商品的策略)和狀態(tài)(如同一個按鈕來控制一個電梯的狀態(tài),又如手機(jī)界面中一個按鈕來控制手機(jī))是兩種完全不同的思想。當(dāng)我們對狀態(tài)和策略進(jìn)行建模時,這種差異會導(dǎo)致完全不同的問題。例如,對狀態(tài)進(jìn)行建模時,狀態(tài)遷移是一個核心內(nèi)容;然而,在選擇策略時,遷移與此毫無關(guān)系。另外,策略模式允許一個客戶選擇或提供一種策略,而這種思想在狀態(tài)模式中完全沒有。 
          •一個策略是一個計劃或方案,通過執(zhí)行這個計劃或方案,我們可以在給定的輸入條件下達(dá)到一個特定的目標(biāo)。策略是一組方案,他們可以相互替換;選擇一個策略,獲得策略的輸出。策略模式用于隨不同外部環(huán)境采取不同行為的場合。我們可以參考微軟企業(yè)庫底層Object Builder的創(chuàng)建對象的strategy實現(xiàn)方式。 
          •而狀態(tài)模式不同,對一個狀態(tài)特別重要的對象,通過狀態(tài)機(jī)來建模一個對象的狀態(tài);狀態(tài)模式處理的核心問題是狀態(tài)的遷移,因為在對象存在很多狀態(tài)情況下,對各個business flow,各個狀態(tài)之間跳轉(zhuǎn)和遷移過程都是及其復(fù)雜的。例如一個工作流,審批一個文件,存在新建、提交、已修改、HR部門審批中、老板審批中、HR審批失敗、老板審批失敗等狀態(tài),涉及多個角色交互,涉及很多事件,這種情況下用狀態(tài)模式(狀態(tài)機(jī))來建模更加合適;把各個狀態(tài)和相應(yīng)的實現(xiàn)步驟封裝成一組簡單的繼承自一個接口或抽象類的類,通過另外的一個Context來操作他們之間的自動狀態(tài)變換,通過event來自動實現(xiàn)各個狀態(tài)之間的跳轉(zhuǎn)。在整個生命周期中存在一個狀態(tài)的遷移曲線,這個遷移曲線對客戶是透明的。我們可以參考微軟最新的WWF 狀態(tài)機(jī)工作流實現(xiàn)思想。 
          •在狀態(tài)模式中,狀態(tài)的變遷是由對象的內(nèi)部條件決定,外界只需關(guān)心其接口,不必關(guān)心其狀態(tài)對象的創(chuàng)建和轉(zhuǎn)化;而策略模式里,采取何種策略由外部條件(C)決定。 
          posted on 2015-04-21 02:43 abin 閱讀(379) 評論(0)  編輯  收藏 所屬分類: PatternDesigns
          主站蜘蛛池模板: 龙海市| 红安县| 黄山市| 菏泽市| 涞源县| 上思县| 永康市| 富川| 禹城市| 城步| 扎兰屯市| 博罗县| 陆川县| 桓仁| 鲜城| 迭部县| 左贡县| 资中县| 辰溪县| 孟州市| 龙泉市| 汉沽区| 乐昌市| 玉环县| 拉孜县| 云和县| 江北区| 汨罗市| 屯门区| 隆回县| 尖扎县| 玉山县| 刚察县| 手机| 仙游县| 咸阳市| 兴和县| 屏南县| 新乡市| 来凤县| 大埔县|