重構(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) 編輯 收藏