資源描述:
《貧血模型or領域模型》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、最近taowen同學連續(xù)發(fā)起了兩起關于貧血模型和領域模型的討論,引起了大家的廣泛熱烈的討論,但是討論(或者說是爭論)的結果到底怎樣,我想值得商榷。問題是大家對貧血模型和領域模型都有自己的看法,如果沒有對此達到概念上的共識,那么討論的結果應該可想而知,討論的收獲也是有的,至少知道了分歧的存在。為了使問題具有確定性,我想從一個簡單例子著手,用我對貧血模型和領域模型的概念來分別實現例子。至于我的理解對與否,大家可以做評判,至少有個可以評判的標準在這。一個例子我要舉的是一個銀行轉帳的例子,又是一個被用濫了的例
2、子。但即使這個例子也不是自己想出來的,而是剽竊的<>中的例子,原諒我可憐的想像力。當錢從一個帳戶轉到另一個帳戶時,轉帳的金額不能超過第一個帳戶的存款余額,余額總數不能變,錢只是從一個賬戶流向另一個帳戶,因此它們必須在一個事務內完成,每次事務成功完成都要記錄此次轉帳事務,這是所有的規(guī)則。??貧血模型我們首先用貧血模型來實現。所謂貧血模型就是模型對象之間存在完整的關聯(可能存在多余的關聯),但是對象除了get和set方外外幾乎就沒有其它的方法,整個對象充當的就是一個數據容器,
3、用C語言的話來說就是一個結構體,所有的業(yè)務方法都在一個無狀態(tài)的Service類中實現,Service類僅僅包含一些行為。這是JavaWeb程序采用的最常用開發(fā)模型,你可能采用的就是這種方法,雖然可能不知道它有個“貧血模型”的稱號,這要多虧MartinFlower(這個家伙慣會發(fā)明術語!)。?包結構在討論具體的實現之前,我們先來看來貧血模型的包結構,以便對此有個大概的了解。?貧血模型的實現一般包括如下包:·dao:負責持久化邏輯·model:包含數據對象,是service操縱的對
4、象·service:放置所有的服務類,其中包含了所有的業(yè)務邏輯·facade:提供對UI層訪問的入口代碼實現先看model包的兩個類,Account和TransferTransaction對象,分別代表帳戶和一次轉賬事務。由于它們不包含業(yè)務邏輯,就是一個普通的JavaBean,下面的代碼省略了get和set方法。Java代碼1.public?class?Account?{??2.????private?String?accountId;??3.????private?BigDecimal?balanc
5、e;??4.??5.????public?Account()?{}??6.????public?Account(String?accountId,?BigDecimal?balance)?{??7.????????this.accountId?=?accountId;??8.????????this.balance?=?balance;??9.????}??10.????//?getter?and?setter?....??11.??12.}??publicclassAccount{privateSt
6、ringaccountId;privateBigDecimalbalance;publicAccount(){}publicAccount(StringaccountId,BigDecimalbalance){this.accountId=accountId;this.balance=balance;}//getterandsetter....}?Java代碼1.public?class?TransferTransaction?{??2.????private?Date?timestamp;??3.?
7、???private?String?fromAccountId;??4.????private?String?toAccountId;??5.????private?BigDecimal?amount;????6.??7.????public?TransferTransaction()?{}??8.??9.????public?TransferTransaction(String?fromAccountId,?String?toAccountId,?BigDecimal?amount,?Date?ti
8、mestamp)?{??10.????????this.fromAccountId?=?fromAccountId;??11.????????this.toAccountId?=?toAccountId;??12.????????this.amount?=?amount;??13.????????this.timestamp?=?timestamp;??14.????}??15.??16.????//?getter?and?setter?....??17