貧血模型
貧血模型最早廣泛應(yīng)用是源自于EJB2,最強(qiáng)盛時(shí)期則是由Spring創(chuàng)造,把“行為”(也稱為邏輯、過程)和“狀態(tài)”(可理解為數(shù)據(jù),對(duì)應(yīng)到語言就是對(duì)象成員變量)分離到不同的對(duì)象之中,那個(gè)只有狀態(tài)的對(duì)象就是所謂的“貧血對(duì)象”(常稱為VO——Value Object),而那個(gè)只有行為的對(duì)象就是我們常見的N層結(jié)構(gòu)中的Logic/Service/Manager層(對(duì)應(yīng)到EJB2中的Stateless Session Bean)。(曾經(jīng)Spring的作者Rod Johnson也承認(rèn),Spring不過是在沿襲EJB2時(shí)代的“事務(wù)腳本”,也就是面向過程編程)
充血模型其實(shí)很簡(jiǎn)單,就是面向?qū)ο笤O(shè)計(jì)的本質(zhì):“一個(gè)對(duì)象是擁有狀態(tài)和行為的”,比如說一個(gè)人,他眼睛什么樣鼻子什么樣這就是狀態(tài),人可以去打游戲或是寫程序,這就是行為。為什么要有一個(gè)“人Manager”這樣的東西存在去幫人“打游戲”呢?
舉個(gè)簡(jiǎn)單的J2EE的例子,設(shè)計(jì)一個(gè)與用戶(User)相關(guān)的功能,傳統(tǒng)的設(shè)計(jì)一般是:
類:User+UserManager
保存用戶調(diào)用:userManager.save(User user);
充血的設(shè)計(jì)則可能會(huì)是:
類:User
保存用戶調(diào)用:user.save();
——User有一個(gè)行為是:保存它自己
其實(shí)它們沒有什么特別適用的方向,個(gè)人更傾向于總是使用充血模型,因?yàn)槊嫦驅(qū)ο缶幊炭偸潜让嫦蜻^程編程要有更豐富的語義、更合理的組織、更強(qiáng)的可維護(hù)性——當(dāng)然也更難掌握一些。因此實(shí)際工程場(chǎng)景中,是否使用,如何使用還依賴于設(shè)計(jì)者以及團(tuán)隊(duì)充血模型設(shè)計(jì)的理解和把握,因?yàn)楝F(xiàn)在絕大多數(shù)J2EE開發(fā)者都受貧血模型影響非常深。
另外,實(shí)際工程場(chǎng)景中使用充血模型還會(huì)碰到很多很多細(xì)節(jié)問題,其中最大的難關(guān)就是“如何設(shè)計(jì)充血模型”或者說“如何從復(fù)雜的業(yè)務(wù)中分離出恰到好處且包含語義的邏輯放到VO的行為中”,因?yàn)橐晕业慕?jīng)驗(yàn)來看,不特指誰,大多數(shù)J2EE開發(fā)者其實(shí)面向?qū)ο蠖歼€沒有入門,不過這個(gè)已經(jīng)超出了當(dāng)前貼的問題:)

浙公網(wǎng)安備 33010602011771號(hào)