如何打破设计中的循环依赖

How to Break Cyclic Dependencies in Design

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

Customer 可以有一个订单列表(1 对 N),Order 有一个指定的客户(1 对 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;
}

您可以创建第三个 class 来打破依赖关系:

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;
    }
}

现在您可以取消来自客户 class 的订单,以及来自订单 class 的客户。还是我误解了你的问题?

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