假设我有一个班级Stock
代表一些基本的股票数据,然后是额外的班级StockDetails
,提供特定股票的一些额外细节。
Stock.java
public class Stock {
private int stockId;
private String stockCode;
private String stockName;
private StockDetail stockDetail;
public Stock() {
}
public Stock(String stockCode, String stockName) {
this.stockCode = stockCode;
this.stockName = stockName;
}
// ...
}
StockDetails.java
public class StockDetail {
private Stock stock; // yes or no?
private String compName;
private String compDesc;
private String remark;
private Date listedDate;
public StockDetail() {
}
public StockDetail(String compName, String compDesc,
String remark, Date listedDate) {
this.compName = compName;
this.compDesc = compDesc;
this.remark = remark;
this.listedDate = listedDate;
}
// ...
}
现在我不确定设计这种关系的最佳方式是什么。 我担心的是:
Stock
是否应该引用StockDetails
而StockDetails
引用它Stock
?StockDetails
没有对Stock
的引用,那就没有任何意义,因为如果没有相应的StockDetails
,Stock
对象就毫无意义。但是,如果确实有,那么从它自己的细节中获取Stock
是毫无意义和奇怪的。 stockDetails.getStock()
。StockDetails
应该是Stock
的内部类吗?这又不理想,因为我想访问StockDetails
之外的Stock
课程。StockDetails
对象,而以前没有Stock
对象,这甚至是毫无意义的。两者应该以某种方式一起实例化,因为它们共存。实现这种关系最明智的方式是什么?
答案 0 :(得分:2)
StockDetail
一个Stock
?如果Stock
是一个可以独立存在的一般概念,但您需要通过其他信息和功能将其专门化,那么您可以考虑继承。然后,同一个对象将代表Stock
和StockDetail
:
public class StockDetail extends Stock { ... }
结果:
Stock
独立于班级StockDetail
StockDetail
取决于Stock
专攻Stock
还是StockDetail
,并且这不会随着时间的推移而发展。 SockDetail
是Stock
的装饰者吗?如果StockDetail
应始终表现为Stock
,但创建时无法确定要创建哪一个,那么您可以考虑使用decorator pattern。
最初你要创建一个Stock
对象。 StockDetail
将从Stock
继承,并保留对相应Stock
的引用。无论您需要详细信息,都可以使用装饰器对象。
结果:
Stock
独立于班级StockDetail
StockDetail
取决于Stock
Stock
对象。 StockDetail
对象的Stock
对象,并使用StockDetail
代替Stock
。 StockDetail
是Stock
根据principle of composition over inheritance,默认情况下这是候选人。您只需将StockDetail
成员添加到Stock
即可。
如果StockDetail
对象依赖于Stock
对象,即如果没有相应的Stock
它就不存在,那么最简单的方法就是始终访问StockDetail
通过其所有者Stock
对象。在这种情况下,不需要反向链接。在DDD术语中,您要说两个对象属于同一个aggregate而Stock
属于aggregate root。
结果:
StockDetail
独立于班级Stock
Stock
取决于StockDetail
Stock
对象。 StockDetail
对象创建Stock
对象。 Stock
和StockDetails
是独立但相关的对象吗?如果Stock
对象具有StockDetail
对象,但如果同时StockDetail
对象可以独立于Stock
对象使用,则需要双向关系。
在这种情况下,您需要Stock
至StockDetail
的引用,以及StockDetail
至Stock
的引用。而且您需要确保两个链接的一致性。
结果:
Stock
和StockDetail
是强耦合且相互依赖的