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

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

          問題:

          左邊樹狀結(jié)構(gòu),選擇不同節(jié)點(diǎn),右邊Viewer顯示該節(jié)點(diǎn)下圖片;左邊樹下方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ò)展,無需改變現(xiàn)有代碼。

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

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

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

          增加新事件需要添加新的if語句

          --------------------------->
          中間過程
          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è),無需改變現(xiàn)有代碼。
          regsiter({"addTag":addTag})
          regsiter({"replaceTag":replaceTag})
          regsiter({"addSubjectTag":addSubjectTag})
          regsiter({"addCredit":addCredit})


          posted on 2011-01-23 17:52 *** 閱讀(272) 評(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)論排行榜

          主站蜘蛛池模板: 佛山市| 故城县| 惠水县| 灵丘县| 阿合奇县| 西青区| 黔江区| 宁强县| 绩溪县| 会东县| 辉南县| 固始县| 清新县| 麻栗坡县| 报价| 武胜县| 景洪市| 龙州县| 正阳县| 吉安县| 玉田县| 尖扎县| 赤水市| 洪江市| 潜山县| 皮山县| 钟山县| 赤城县| 防城港市| 长岛县| 永清县| 县级市| 德惠市| 贡嘎县| 宁蒗| 安庆市| 泰和县| 泸西县| 庆城县| 温泉县| 新河县|