JavaBean被稱爲anemic domain model的緣由是JavaBean或者POJO徹底淪爲了properties bag(能夠類比到C/C++裏的struct)。html
DDD的爭論認爲一個POJO而後加上一堆setter和getter根本稱不上爲一個Object(對象),對象是真實世界業務對象的反應。java
回想剛學Java的的時候,經典的Java書籍裏是否是會讓你寫一個Cat
,Dog
類,而後繼承Animal
接口,他們有eat
、bark
、shit
、pee
等行爲。程序員
對象的意義在於封裝並提供行爲,而POJO的setter
、getter
破壞了封裝。
並且更糟糕的是,只提供setter
和getter
的POJO在面對真實業務對象的時候就會顯得弊端重重。app
仍是拿Cat
作例子,好比你餵它食物,貓會的happy
指數會提升,飢餓感會降低,對主人的忠誠度也會提升,在DDD裏,咱們只要這樣寫就OK了:cat.feed(food),若是是POJO的話就會變成:dom
cat.setHappiness(..); cat.setLoyalty(..); cat.setHunger(..)
並且POJO是違反SRP原則的(若是要修改一個類,那麼指應該是它的職責發生變化,而不該該是其餘)。設計
若是項目經理某天告訴你,貓被餵食後還要增長毛色的光澤度,若是是DDD設計的,咱們只須要修改Cat.feed
的實現就好了。code
而若是是POJO的話,那麼咱們要在全部原來cat.setHappiness(..)
, cat.setLoyalty(..)
, cat.setHunger(..)
的地方添加一個cat.set毛色光澤度(..)
。htm
你可能會爭論,我能夠把feed
的業務邏輯寫在Service
裏嘛,可是這就違反了OOD(對象是數據的封裝和行爲的組合),對象
並且由於你已經暴露了setter
和getter
,那麼程序員一定會繞過你的Service
,這樣對系統來講也就增長了混亂。繼承
能夠看Martin Fowler的這篇文章 AnemicDomainModel