java - 這種情況怎么設(shè)計(jì)class? 有什么設(shè)計(jì)模式嗎
問題描述
一種通過硬件設(shè)備的數(shù)據(jù)用了特殊格式,前一段是id,后一段是數(shù)據(jù),
前面一段,代表它是一段類型為A, B, C等等哪一種類型的數(shù)據(jù)。
根據(jù)前面的類型,我們?nèi)『竺嬷械哪硯孜唬鏏類型我們需要數(shù)據(jù)取數(shù)據(jù)的1-3位,B類型則需要第20和第22位。
現(xiàn)在設(shè)計(jì)的時(shí)候只需要能接受a類和b類就行了,但是未來想要接受c類, d類等等,同時(shí)對數(shù)據(jù)進(jìn)行的操作也不同,比如a類需要把1-3位都乘二,b類第二十位加1,第二十二位不變z
問題是應(yīng)該怎么樣設(shè)計(jì),未來拓展的時(shí)候方便呢?比如我想支持d類,不用重寫代碼....
問題解答
回答1:復(fù)雜的話用策略模式,不復(fù)雜的直接OO的繼承,不同類型的消息交給不同的子類去處理。
回答2:應(yīng)該把數(shù)據(jù)協(xié)議格式規(guī)定好:例如:高3位代表類型,中間2位代表協(xié)議版本,后面代表數(shù)據(jù)。協(xié)議規(guī)定好后,通過模板方法來處理,將具體解析放到子類,通用的放到父類。這樣在擴(kuò)展時(shí),不需要改動原有代碼,只需要寫新的實(shí)現(xiàn)就可以。
回答3:根本用不到設(shè)計(jì)模式,傳統(tǒng)的繼承就可以,各個(gè)子類分別取不同的字段就可以。
回答4:如果一定要使用設(shè)計(jì)模式,可以考慮一哈策略模式
回答5:還需要判斷一下后續(xù)的使用者,工廠模式,策略模式,代理模式可能都能滿足你擴(kuò)展的需求,其實(shí)重要的是想法,遵照六原則設(shè)計(jì)吧,沒必要非要套某一個(gè)模式,根據(jù)需求,代碼慢慢演變,最后可能自然的就符合某個(gè)模式了,也可能是多種模式的組合。
相關(guān)文章:
1. python - sqlalchemy更新數(shù)據(jù)報(bào)錯(cuò)2. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異?!钡膬?nèi)存錯(cuò)誤?3. javascript - h5微信中怎么禁止橫屏4. macos - 無法source activate python275. empty比isset更嚴(yán)格一點(diǎn)6. thinkphp6使用驗(yàn)證器 信息如何輸出到前端頁面7. 我在導(dǎo)入模板資源時(shí)遇到無法顯示的問題,請老師解答下8. PHPExcel表格導(dǎo)入數(shù)據(jù)庫怎么導(dǎo)入9. javascript - 微信網(wǎng)頁開發(fā)從菜單進(jìn)入頁面后,按返回鍵沒有關(guān)閉瀏覽器而是刷新當(dāng)前頁面,求解決?10. 預(yù)訂金和尾款分別支付

網(wǎng)公網(wǎng)安備