背景

一个实体在不同的上下文中具备不同的职责,如:产品在“生产完成上下文”中具备的一些职责,在“质检相关上下文”中具备另外一些职责。四色原型、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的 “六” 种实现方式的更多相关文章

  1. DDD:四色原型中Role的 “六” 种实现方式和PHP的Swoole扩展

    目录 背景六种实现方式第一种:未显式体现角色的模式.第二种:使用“显式接口”显式体现角色的模式.第三种:使用“扩张方法”显式体现角色的模式.第四种:使用“领域服务”显式体现角色的模式.第五种:使用“包 ...

  2. .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)

    阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...

  3. .NET应用架构设计—四色原型模式(色彩造型、域无关的模型)(概念版)

    阅读文件夹: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来事实上我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙, ...

  4. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  5. spring 整合 mybatis 中数据源的几种配置方式

    因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下. 一.采用org.mybatis.spring.mapp ...

  6. Django中提供的6种缓存方式

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用: 缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...

  7. Springboot中IDE支持两种打包方式,即jar包和war包

    Springboot中IDE支持两种打包方式,即jar包和war包 打包之前修改pom.xml中的packaging节点,改为jar或者war    在项目的根目录执行maven 命令clean pa ...

  8. Vue中常用的几种传值方式

    Vue中常用的几种传值方式 1. 父传子 父传子的实现方式就是通过props属性,子组件通过props属性接收从父组件传过来的值,而父组件传值的时候使用 v-bind 将子组件中预留的变量名绑定为da ...

  9. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

随机推荐

  1. 转:最简单的视频网站(JavaEE+FFmpeg)

    本文记录一个最简单的视频网站系统.此前做过一些基于JavaEE中的 SSH (Strut2 + Spring + Hibernate)的网站系统,但是一直没有做过一个视频网站系统,所以就打算做一个&q ...

  2. Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(三)

    一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)篇 二.本篇目标: l  说说游戏中各种角色的动作.属性以及重构思路 l  进行代码重构让色狼大叔和 ...

  3. Initializing a collection

    Before Java 1.7, only this one is permitted: ArrayList<String> a = new ArrayList<String> ...

  4. EventBus 3.0使用

    在没用eventBus之前一直用Android广播方式通知消息更新UI 广播写法 首先发送广播通知 Intent intent = new Intent(); intent.setAction(&qu ...

  5. [原创]可动态显示圆形图像或圆形文字的AvatarImageView

    项目地址: https://github.com/Carbs0126/AvatarImageView 前言: 在做电话本或者其他应用时,显示联系人头像的策略一般是这样的:先判断是否有头像图片,如果有, ...

  6. 程序猿每个VPN真卡手

    昨天起使用了好久好久觉得是世上最好用的poVPN貌似跑路了 刚刚续费了一年也就这样没有了,可是更多的是心疼没有好用的vpn服务. 不过查到了一个红杏chrome插件,不是vpn 如果单单上网页足够了 ...

  7. js多线程?

    http://www.cnblogs.com/o--ok/archive/2012/11/04/JS.html http://blog.csdn.net/nx8823520/article/detai ...

  8. 将数据库表导入到solr索引

    将数据库表导入到solr索引 编辑solrcofnig.xml添加处理器 <requestHandler name="/dataimport" class="org ...

  9. IIS7.5配置SSL

    1,首先需要准备两个证书(CA证书,服务器证书). CA证书由公共的CA机构提供,widnow系统内部已经内置了很多这类证书,如图(日文系统). 服务器证书是导入到IIS里面用的. 2,有了上面的认识 ...

  10. 跟随标准与Webkit源码探究DOM -- 获取元素之getElementsByClassName

    按照类名获取元素 -- getElementsByClassName(HTML5) 标准 WHATWG 在Document与Element上均有定义,原型 HTMLCollection getElem ...