发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 SOA

DDD中实体的行为的问题

    
2010-03-30 17:16
赞助商链接

有个设计的问题请教下大家,请各位赐教。
现在需要设计个电子商务系统的产品结构,需求规划:
1、产品的属性必须能动态扩展,例如衣服有颜色属性、数码相机有像素属性。
2、产品属性可以独立维护,并且在创建产品时可以从系统的属性库中挑选组成产品的所有属性
3、每个属性其对应的值类型都不一样,例如像素属性的值是字符串,颜色属性的值是数字(姑且这样假设)
4、创建产品时,属性的值需要由管理员设定,并且设定的值必须符合属性值类型的约束(例如数字类型的就不允许输入字符串)

从这个需求中,我初步设计如下:
1、Product表示产品,它是一个实体
2、Attribute<T>表示“属性”,它是一个实体。T是一个类型参数,用于表示这个属性的值类型。
3、AttributeValue<T>表示属性值,它是一个值对象。T是一个类型参数,用于表示这个属性的值类型。


Product与Attribute之间是1对多关系,这个结构为了实现能动态向产品增加属性。
Attribute类的有个方法:
1、createValue(T value)方法,用于创建AttributeValue,将外部传入的value转换(创建)为AttributeValue

问题:我的思路是,由于属性值类型的不确定性,所以这里不能将从Object到AttributeValue的转换写死,而应该引入一个其它东西来做这些事情,我目前想到了策略模式。createValue通过value参数的类型从策略管理器中找到一个能处理转换的策略对象,由这个策略对象负责转换工作,不知道这种设计是否得当?这里的策略类应该属于什么范畴的东西呢,是另一个DDD中的实体么?

另外再有个问题,DDD中的实体是否只能严格反应领域中的业务对象,那我们在设计时根据业务对象的一些特殊行为,而设计出来的其它类是否也能作为DDD中的实体呢?

2010-03-30 21:16



public class Product {

private List properties = new LinkedList<Property>();

public <T> void addProperty(String name,T value){
this.properties.add(new Property(name,value));
}
.....
}


class Property<T>{

//属性名
private String name;

private T value;

//表示属性是属于哪个实体的
private Serializable ownerId;

public Property(String name, T value) {
this.name = name ;
this.value = value;
}


}


以上是模型,考虑到技术存储,如果采用colume-oriented的数据库会容易些,比如采用cassandra,hbase等,这样属性就可以动态扩展。

2011-10-25 15:33

class Property<T>中为什么要到下面的代码
//表示属性是属于哪个实体的 private Serializable ownerId;

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com