对象应该知道其他对象有什么吗?

时间:2016-04-14 22:47:08

标签: java oop

例如,我有两个类:Book和Customer。客户有一个列表,其中包含所购买的所有图书。通过这种设计,我可以轻松查找客户的购买历史记录。

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

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

3 个答案:

答案 0 :(得分:0)

即使是参考书籍清单的顾客班也不是那么好。

让客户和图书课程彼此不了解。而是维护地图以供您快速参考。例如 -

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

通过assignBook(Customer c, Book b)returnBook(Customer c, Book b)方法操作这些地图

答案 1 :(得分:0)

您可以做的一件事是检查客户班级内的清单,检查图书购买历史记录,如下所示:

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

或者你可以做同样的事情,但SetBook内的客户。

答案 2 :(得分:0)

理想情况下,要保持纯洁,书籍和顾客都不应该彼此了解。我会创建第三个类,购买,包含对客户和书籍的引用,订购日期,发货日期,支付价格等。

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