定義:測試
實體不只須要知道它是什麼,還要知道它是哪一個,值對象只關心它是什麼。優化
實體:許多對象不是由它們的屬性來定義,而是經過一系列的連續性和標識來從根本定義的。只要一個對象在生命週期中可以保持連續性,而且獨立於它的屬性(即便這些屬性對系統用戶很是重要),那它就是一個實體。對象
值對象:當你只關心某個對象的屬性時,該對象即可以做爲一個值對象。爲其添加有意義的屬性,並賦予它相應的行爲。咱們須要將值對象當作不變對象,不要它任何身份標識,還應該儘可能避免像實體對象同樣的複雜性。生命週期
對於實體,實體核心是用惟一的標識符來定義,而不是經過屬性定義。即便屬性徹底相同的也多是不一樣的對象。同時實體自己是由狀態的,實體有嚴謹的生命週期,實體自己會體現出相關的業務行爲,業務行爲會被實體屬性或狀態形成影響和改變。變量
值對象自己無狀態,不可變,而且不分配具體的標識。自己無生命週期,也不會產生獨立行爲。方法
舉個栗子:數據
一、手機由SN號識別,手機是一個實體。手機的配件這種場景下就是值對象。項目
二、體育場的座位,門票上有座位號,座位號能夠最爲惟一標識,座位是實體。可是若是門票沒有座位號,先到先作,座位沒有座位號,只有數量,坐一個少一個,這時候座位就是值對象。模型
值對象的使用目的:管理
使用不變的值對象使得咱們作更少的職責假設。
值對象用於度量和描述事物,DDD中建議儘可能使用值對象來建模而不是實體對象,由於值對象很是容易的進行建立、測試、使用、優化和維護。
值對象的特徵:
一、它度量或者描述了領域的一件東西。
二、它能夠做爲不變量。
三、它能夠將土撥杆的相關的屬性結合成一個概念總體。
四、當度量和描述發生改變的時候,能夠用另外一個值對象替換。
五、它能夠和其餘值對象進行相等比較
六、它不會對協做對象形成反作用
最小化集成:
DDD項目中,一般存在多個限界上下文,這意味着咱們須要找到合適的方法對這些上下文進行集成。當模型概念從上流上下文流入下游上下文時,儘可能使用值對象表示這些概念。這樣能夠達到最小化集成,便可以最小化下游模型中用於管理職責的屬性數數目。使用不便的值對象使得咱們作更少的職責假設。
聚合與聚合根
定義了對象之間清晰的關係和邊界,並實現領域模型的內聚。
必須將聚合做爲一個修改數據的單元。
一個聚合必須有一個聚合根,根是聚合中的一個實體,一般聚合中其餘實體須要依賴於聚合根,其餘實體不能沒有聚合根而存在,從業務的角度看它是沒有單獨存在的意義。
對一個聚合中的實體的訪問和操做,必須經過這個聚合的聚合根開始,確保一致性規則。例如訂單的總金額依賴每一個訂單項的總和。
一個聚合只有一個聚合根,聚合根是能夠獨立存在的,聚合中其餘實體或者值對象依賴聚合根。
只有聚合根才能被外部訪問到。
針對功能模塊進行系統劃分,粒度太粗,使用聚合能夠精確劃分粒度。