如果一个对象知道其他对象拥有它



例如,我有两个类:Book和Customer。客户有一份清单,其中包含了其购买的所有书籍。我可以用这个设计很容易地查找客户的购买历史。

然而,如果我想知道有多少客户购买了一本特定的书,通常我会查找所有客户的购买历史记录,并找到购买这本特定书的客户。这可能是一个耗时的查找过程。我想知道在Book类中添加List,并将购买该特定书籍的所有Customer添加到此List是否是更好的方法。

我想知道我的方法在设计方面会不会更好/更差。这肯定会使Book-Customer强耦合,但我不确定是否有其他方法可以实现这种方法。

理想情况下,为了纯粹,书籍和客户都不应该了解彼此。相反,我会创建第三个类Purchase,其中包含对客户和书籍的引用、订购日期、发货日期、支付价格等。

然后我会有一个Map<Customer, List<Purchase>>和可选的Map<Book, List<Purchase>>

即使Customer类引用了图书列表也不是很好。

让Customer和Book类都不知道对方。相反,维护地图以供您快速参考。例如-

Map<Customer, List<Book>> customerToBooks;
Map<Book, List<Customer>> bookToCustomers;

并通过assignBook(Customer c, Book b)returnBook(Customer c, Book b)方法操作这些映射

您可以做的一件事是检查客户类中的列表,检查图书购买历史,如下所示:

客户.java

public class Customer{
    public Set<Book> purchases = new HashSet<Book>();
    public void purchaseBook(Book b){
        purchases.add(b);
    }
}

原始类别:

public Set<Customer> customers = new HashSet<Customer>();
public Set<Customer> getCustomersFromBook(Book b){
    Set<Customer> ret = new HashSet<Customer>();
    for(Customer c : customers){
        if(c.purchases.contains(b)){
            ret.add(c);
        }
    }
    return ret;
}

或者,您可以做同样的事情,但要将客户放在Book类中的Set中。

最新更新