DDD:四色原型中Role的 “六” 种实现方式
2013-08-28 08:15
429 查看
背景
一个实体在不同的上下文中具备不同的职责,如:产品在“生产完成上下文”中具备的一些职责,在“质检相关上下文”中具备另外一些职责。四色原型、DIC和“UML事物模式”在不同的维度阐述了这一情况,在代码层面到底该如何表达呢?本文给出了一些思路。六种实现方式
因为:MI(Manufacture和QualityTesting)和Context(ManufactureContext、QualityTestingBeginningContext和QualityTestingCompletingContext)都是空实现且每种风格中的代码都一样,后面只给出跟PPT和Role相关的代码。第一种:未显式体现角色的模式。
类图代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V1 { class Product { public void CompleteManufacture(ManufactureContext context) { } public void BeginQualityTesting(QualityTestingBeginningContext context) { } public void CompleteQualityTesting(QualityTestingCompletingContext context) { } } }
第二种:使用“显式接口”显式体现角色的模式。
类图代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V2 { interface IManufactureProduct { void CompleteManufacture(ManufactureContext context); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V2 { interface IQualityTestingProduct { void BeginQualityTesting(QualityTestingBeginningContext context); void CompleteQualityTesting(QualityTestingCompletingContext context); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V2 { class Product : IManufactureProduct, IQualityTestingProduct { void IManufactureProduct.CompleteManufacture(ManufactureContext context) { } void IQualityTestingProduct.BeginQualityTesting(QualityTestingBeginningContext context) { } void IQualityTestingProduct.CompleteQualityTesting(QualityTestingCompletingContext context) { } } }
第三种:使用“扩张方法”显式体现角色的模式。
类图代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V3 { static class ManufactureProductExtentions { public static void CompleteManufacture(this Product that, ManufactureContext context) { } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V3 { static class QualityTestingProductExtentions { public static void BeginQualityTesting(Product that, QualityTestingBeginningContext context) { } public static void CompleteQualityTesting(Product that, QualityTestingCompletingContext context) { } } }
第四种:使用“领域服务”显式体现角色的模式。
类图代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V4 { class ManufactureProductService { public void CompleteManufacture(Product product, ManufactureContext context) { } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V4 { class QualityTestingProductService { public void BeginQualityTesting(Product product, QualityTestingBeginningContext context) { } public void CompleteQualityTesting(Product product, QualityTestingCompletingContext context) { } } }
第五种:使用“包装类型”显式体现角色的模式。
类图代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V5 { class ManufactureProduct { private Product _product; public ManufactureProduct(Product product) { _product = product; } public void CompleteManufacture(ManufactureContext context) { } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DCIStudy.V5 { class QualityTestingProduct { private Product _product; public QualityTestingProduct(Product product) { _product = product; } public void BeginQualityTesting(QualityTestingBeginningContext context) { } public void CompleteQualityTesting(QualityTestingCompletingContext context) { } } }
第六种:使用“动态代理”显式体现角色的模式。
时间不够了,这种实现方式需要独立写一篇文章。如何设计Context?
PPT对应的Role会参与到一个到多个Context中,一般来说一个Context涉及一个MI,如果MI为“Moment”,多数情况需要一个Context,如果MI为“Interval”,多数情况需要两个Context,根据MI的业务生命周期不同,所需的Context也不同。备注
仓促写完,还没有具体深入分析如何做出不同的选择和折中,群里有朋友实战过,有机会再写一篇这样的文章。相关文章推荐
- DDD:四色原型中Role的 “六” 种实现方式和PHP的Swoole扩展
- DDD:用 “四色原型” 进行 “职责分配”
- DDD-领域模型-四色原型
- 通过原型的方式实现遍历
- 编程基础-面向对象-对象的实现方式(模版/原型)
- DDD:四色原型、DDD、DCI之间的关系
- 构造函数+原型混合方式实现js的继承
- DDD与四色原型
- javascript 原型链---继承方式怎么实现继承
- DDD:通过四色原型来理解聚合
- js 动态原型方式 实现ajax异步类
- DDD:用 “四色原型” 进行 “聚合设计”
- JavaScript实现继承机制(3)——通过原型链(prototype chaining)方式
- Java设计模式(四):原型模式深拷贝的两种实现方式,以及和new对象的性能测试对比
- 纯css,js原生,js原型,jquery四种方式实现轮播图效果
- DDD:用 “四色原型” 进行 “聚合设计”
- JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)
- JavaScript面向对象-基于原型链和函数伪装组合的方式实现继承
- Ajax方式分页加载列表实现
- Javascript--原型链实现继承