明智的一对一阶级关系

时间:2017-11-04 14:24:05

标签: java oop design-patterns

假设我有一个班级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;
    }

    // ...
}

现在我不确定设计这种关系的最佳方式是什么。 我担心的是:

  1. Stock是否应该引用StockDetailsStockDetails引用它Stock
  2. 如果StockDetails没有对Stock的引用,那就没有任何意义,因为如果没有相应的StockDetailsStock对象就毫无意义。但是,如果确实有,那么从它自己的细节中获取Stock是毫无意义和奇怪的。 stockDetails.getStock()
  3. StockDetails应该是Stock的内部类吗?这又不理想,因为我想访问StockDetails之外的Stock课程。
  4. 能够实例化StockDetails对象,而以前没有Stock对象,这甚至是毫无意义的。两者应该以某种方式一起实例化,因为它们共存。
  5. 实现这种关系最明智的方式是什么?

1 个答案:

答案 0 :(得分:2)

StockDetail一个Stock

如果Stock是一个可以独立存在的一般概念,但您需要通过其他信息和功能将其专门化,那么您可以考虑继承。然后,同一个对象将代表StockStockDetail

public class StockDetail extends Stock { ... }

结果:

  • 班级Stock独立于班级StockDetail
  • 课程StockDetail取决于Stock专攻
  • 无论何时创建对象,您都需要确定它是Stock还是StockDetail,并且这不会随着时间的推移而发展。

SockDetailStock的装饰者吗?

如果StockDetail应始终表现为Stock,但创建时无法确定要创建哪一个,那么您可以考虑使用decorator pattern

最初你要创建一个Stock对象。 StockDetail将从Stock继承,并保留对相应Stock的引用。无论您需要详细信息,都可以使用装饰器对象。

结果:

  • 班级Stock独立于班级StockDetail
  • 班级StockDetail取决于Stock
  • 您始终首先创建一个Stock对象。
  • 您可以创建引用StockDetail对象的Stock对象,并使用StockDetail代替Stock

StockDetailStock

的组成部分

根据principle of composition over inheritance,默认情况下这是候选人。您只需将StockDetail成员添加到Stock即可。

如果StockDetail对象依赖于Stock对象,即如果没有相应的Stock它就不存在,那么最简单的方法就是始终访问StockDetail通过其所有者Stock对象。在这种情况下,不需要反向链接。在DDD术语中,您要说两个对象属于同一个aggregateStock属于aggregate root

结果:

  • 班级StockDetail独立于班级Stock
  • 班级Stock取决于StockDetail
  • 您始终首先创建一个Stock对象。
  • 您可以为StockDetail对象创建Stock对象。

StockStockDetails是独立但相关的对象吗?

如果Stock对象具有StockDetail对象,但如果同时StockDetail对象可以独立于Stock对象使用,则需要双向关系。

在这种情况下,您需要StockStockDetail的引用,以及StockDetailStock的引用。而且您需要确保两个链接的一致性。

结果:

  • StockStockDetail是强耦合且相互依赖的
  • 当您访问一个类的对象时,您可以访问另一个类的相应对象