重構(gòu)與設(shè)計(jì)模式

          1. 狀態(tài)模式
          對(duì)象行為的行為依賴于它所處的狀態(tài),對(duì)象的行為隨著狀態(tài)的改變而改變。解決不同狀態(tài)下,行為不同的問(wèn)題。

          問(wèn)題:

          左邊樹(shù)狀結(jié)構(gòu),選擇不同節(jié)點(diǎn),右邊Viewer顯示該節(jié)點(diǎn)下圖片;左邊樹(shù)下方search框,右邊Viewer顯示滿足search條件的圖片。抽象出Viewer對(duì)象,有兩個(gè)不同狀態(tài)view和search,不同狀態(tài)下更新Viewer的方式不同,即
          tree.onselect -> state="view"
          search -> state="search"

          if(state="view"){
            updateView(path,start,limit)
          }else if(state="search"){
            updateSearch(path,start,limit,searchCriteria)
          }

          Viewer, search, tree耦合在一起,需要全局變量state。

          解決方案:

          抽象兩個(gè)狀態(tài)對(duì)象
          viewAction ->  updateView(path,start,limit)
          searchAction -> updateSearch(path,start,limit,searchCriteria)

          Viewer對(duì)象
          變量 updateAction
          方法 setUpdateAction(action)
          方法 update()調(diào)用 -> updateAction()

          狀態(tài)改變時(shí),改變所選的狀態(tài)對(duì)象
          tree.onselect -> Viewer.setUpdateAction(viewAction)
          search -> Viewer.setUpdateAction(searchAction)

          Viewer, search, tree解藕,去除了全局變量state,行為局域化。假如以后加入view,search外的其他狀態(tài),只需增加newAction狀態(tài)對(duì)象,并在調(diào)用處添加Viewer.setUpdateAction(newAction),便于擴(kuò)展,無(wú)需改變現(xiàn)有代碼。

          2. 不知道該叫什么模式
           
          問(wèn)題:右鍵事件
          if(action=="addTag"){
            addTag()
          }
          if(action=="replaceTag"){
          replaceTag()
          }

          if(action=="addSubjectTag"){
          addSubjectTag()
          }

          if(action=="addCredit"){
          addCredit()
          }

          增加新事件需要添加新的if語(yǔ)句

          --------------------------->
          中間過(guò)程
          var items={
            "addTag":addTag,
            "replaceTag":replaceTag,
            "addSubjectTag":addSubjectTag,
            "addCredit":addCredit
          }

          perform(){
           items[action]()
          }

          --------------------------->
          事件注冊(cè),提供注冊(cè)接口
          var items = {}

          perform(){
           items[action]()
          }

          register(option){
           items.add(option)
          }

          增加右鍵事件時(shí),只需自行注冊(cè),事件的執(zhí)行與事件本身完全解藕,同時(shí)新事件加入時(shí),只需注冊(cè),無(wú)需改變現(xiàn)有代碼。
          regsiter({"addTag":addTag})
          regsiter({"replaceTag":replaceTag})
          regsiter({"addSubjectTag":addSubjectTag})
          regsiter({"addCredit":addCredit})


          posted on 2011-01-23 17:52 *** 閱讀(273) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2011年1月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 朝阳市| 安乡县| 万安县| 西乌| 田阳县| 洛宁县| 榆中县| 红桥区| 临江市| 沅陵县| 色达县| 师宗县| 巴楚县| 伊金霍洛旗| 定日县| 张北县| 黄龙县| 雷山县| 宜州市| 汉寿县| 建瓯市| 沙河市| 都江堰市| 嵩明县| 阜阳市| 边坝县| 肇东市| 和政县| 无锡市| 南丹县| 拉萨市| 乌兰察布市| 钟山县| 镇巴县| 深水埗区| 宣城市| 嘉鱼县| 凭祥市| 灵山县| 洛扎县| 六枝特区|