【问题标题】:How to Break Cyclic Dependencies in Design如何打破设计中的循环依赖
【发布时间】:2016-05-24 18:02:24
【问题描述】:

我正在寻找一个设计解决方案来解决我有 2 个相互依赖的类的问题,因此我有 class Customerclass Order 其中:

Customer 可以有一个订单列表(一对一),Order 有一个指定的客户(一对一)。

打破这种依赖关系的最佳做法是什么?

【问题讨论】:

  • 这是我偶尔会遇到的问题,尽管互联网上有几篇关于解决循环依赖的文章,但到目前为止,我无法针对这种特殊情况提出最佳解决方案。如果您有任何建议,我将不胜感激。

标签: java cyclic-dependency


【解决方案1】:

假设你有如下依赖:

public class Customer {
    private long customerId;
    private String name;
    private String address1;
    // ....
    private List<Order> orders;
}

public class Order {
    private long orderNumber;
    private Date orderDate;
    // ... others
    private Customer customer;
}

你可以创建第三个类来打破依赖:

public class CustomerOrder {
    private final Customer customer;
    private final List<Order> orders;
    public CustomerOrder(Customer customer) {
        super();
        this.customer = customer;
        this.orders = new ArrayList<Order>();
    }
    public void addOrder(Order order) {
        orders.add(order);
    }
    public Customer getCustomer() {
        return customer;
    }
    public List<Order> getOrders() {
        return orders;
    }
}

现在您可以从 Customer 类中删除订单,从 Order 类中删除客户。还是我误解了你的问题?

【讨论】:

  • 谢谢 - 这就是问题所在。那么我的问题是,如果我想更新特定订单,我需要找到其中包含此订单的适当 CustomerOrder 对象。所以我需要对所有 CustomerOrders 进行搜索,以遍历每个订单中的所有订单以找到正确的 CustomerOrder 对象,然后更新订单。有没有办法克服这种昂贵的“查找和更新”操作?
  • 查找不需要很昂贵。您必须在订单上创建一个索引,以便按订单号快速查找。此查找是否使用数据库完成?
  • 不,现阶段不是数据库。您能否详细说明在这种情况下查找订单的示例?我仍在努力理解/找到一种有效的方法来做到这一点。
  • 一种方法(也许不是最好的)是:假设你有'int orderNumber'。现在创建一个 HashMap,其中键是 orderNumber。每次添加 customerOrder 时,您都会在 Map 中添加条目(每个订单一个)。现在您的检索时间非常快: Map.get(orderNumber) 检索 customerOrder
  • 这看起来是最适合这种情况的方式 - 谢谢
【解决方案2】:

作为一名大约 2 年的软件工程师,我见过的最好的情况是对一个类进行影子定义,而不将其初始化为任何内容,只需告诉编译器“嘿,订单存在”,然后显式定义另一个类,然后显式定义您的订单类。这会让你朝着正确的方向前进吗?节点和树有时以这种方式建模,数据结构和算法分析书籍也往往对此有不错的设计解决方案。

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 2015-10-13
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多