2017-09-06 博客遷移 《一種MVC架構(gòu)的改良方式》
在國際象棋項目里往堡,核心對局采用常見的MVC架構(gòu),但由于對局邏輯相當(dāng)復(fù)雜卿操,如果不解耦就會導(dǎo)致C層代碼非常多扳肛。由于大部分邏輯都是請求-響應(yīng)的結(jié)構(gòu),所以便有了把請求(Cmd)和響應(yīng)(Action)從C層文件中抽離出來的想法统求。
具體結(jié)構(gòu)圖如下:
Cmd和Action的定義:
每一個單獨的請求都對應(yīng)一個CmdXXX類检碗,如進房、坐下码邻、等待折剃、開始、退出像屋、再來一局怕犁、走棋、放棄等己莺,每一個CmdXXX是IChessCmd接口的實現(xiàn)奏甫,CmdXXX只需要定義DoCmd具體的邏輯即可。
IChessCmd中DoCmd的形參為發(fā)出請求所需要的參數(shù) IChessAction中DoAction的形參為請求響應(yīng)的參數(shù)
Cmd和Action的目錄結(jié)構(gòu)
在Controller初始化Cmd和Action
在Controller利用字典映射的方式胜蛉,以key為枚舉值款筑,value為對應(yīng)的Cmd或者Action智蝠,初始化_dictCmd和_dictAction。
Cmd和Action的執(zhí)行
在Controller層定義DoCmd和DoAction方法奈梳,當(dāng)發(fā)出一個請求是杈湾,比如要發(fā)走棋協(xié)議,就執(zhí)行ChessGameController.GetInstance().DoCmd(EnumChessCmd.eCmdMove, _srcX, _srcY, _dstX, _dstY, (int)selectType);
selectType為所走的棋子類型攘须。當(dāng)協(xié)議回包到達時漆撞,Controller就調(diào)用DoAction(EnumChessAction.eActionMove)
走回包響應(yīng)的邏輯。
在項目中于宙,Controller有一個自己的消息接收隊列浮驳,每一幀輪詢隊列,如果隊列有信息捞魁,將信息pop出來至会,并執(zhí)行對應(yīng)的Action操作。
優(yōu)缺點
優(yōu)點:
1谱俭、減少C層代碼
2奉件、結(jié)構(gòu)清晰,適合涉及多協(xié)議交互的邏輯
3昆著、在項目后期有新成員加入县貌,CodeReview的時候只需要花10分鐘講解一下這種架構(gòu),新成員都反饋說這種架構(gòu)很清晰凑懂,一聽就懂煤痕,學(xué)習(xí)成本很低。
缺點:
1接谨、不適合簡單協(xié)議交互的邏輯摆碉,比如個人信息界面,只涉及拉取個人信息的邏輯脓豪,不需要也不建議用這種架構(gòu)