【问题标题】:Design the interaction between classes - regarding the Solution 8.7 of Cracking the Coding Interview设计类之间的交互——关于Cracking the Coding Interview的解决方案8.7
【发布时间】:2016-05-22 13:47:48
【问题描述】:

我正在学习《Cracking the Coding Interview》这本书,并且对第 8 章:面向对象设计有一些疑问。以8.7题为例:

8.7 解释您将如何设计聊天服务器。特别是,提供有关各种后端组件、类和方法的详细信息。最难解决的问题是什么?

可以在github repo 找到解决方案。

我的一般问题是:如何将不同的方法分配给不同的类以完成功能?进行这些交互是否有一些原则或共同想法?以一个特定的功能——用户 A 添加用户 B——为例:

以下是UserManager的部分代码:

public class UserManager {
    ...
    public void addUser(User fromUser, String toAccountName) {
        User toUser = usersByAccountName.get(toAccountName);
        AddRequest req = new AddRequest(fromUser, toUser, new Date());
        toUser.receivedAddRequest(req);
        fromUser.sentAddRequest(req);
    }

    public void approveAddRequest(AddRequest req) {
        req.status = RequestStatus.Accepted;
        User from = req.getFromUser();
        User to = req.getToUser();
        from.addContact(to);
        to.addContact(from);
    }

    public void rejectAddRequest(AddRequest req) {
        req.status = RequestStatus.Rejected;
        User from = req.getFromUser();
        User to = req.getToUser();
        from.removeAddRequest(req);
        to.removeAddRequest(req);       
    }
    ...
}

以下是User的部分代码:

public class User {
    ... 
    public boolean addContact(User user) {
        if (contacts.containsKey(user.getId())) {
            return false;
        } else {
            contacts.put(user.getId(), user);
            return true;
        }
    }

    public void receivedAddRequest(AddRequest req) {
        int senderId = req.getFromUser().getId();
        if (!receivedAddRequests.containsKey(senderId)) {
            receivedAddRequests.put(senderId, req);
        }       
    }

    public void sentAddRequest(AddRequest req) {
        int receiverId = req.getFromUser().getId();
        if (!sentAddRequests.containsKey(receiverId)) {
            sentAddRequests.put(receiverId, req);
        }       
    }

    public void removeAddRequest(AddRequest req) {
        if (req.getToUser() == this) {
            receivedAddRequests.remove(req);
        } else if (req.getFromUser() == this) {
            sentAddRequests.remove(req);
        }
    }

    public void requestAddUser(String accountName) {
        UserManager.getInstance().addUser(this, accountName);
    }
    ...
}

我只是想知道approveAddRequest(AddRequest req) 和rejectAddRequest(AddRequest req) 在哪里被调用。在发送或接收AddRequest 后,将不再进行任何行为来真正处理此请求。

另外,我想知道:类之间的每次交互都应该是这样吗(即,来自不同类的许多方法被调用并被多次调用)?

【问题讨论】:

    标签: java function class methods object-oriented-analysis


    【解决方案1】:

    您正在寻找的是“观察者”模式。

    这是 GoF 为事件处理引入的最佳实践。

    您在此处展示的内容与聊天无关。它只是处理用户交互的实用程序。

    至于你最后一个问题:你没有看到完整的代码,所以你不知道它是从哪里调用的。您应该首先找到完整的源代码。你是对的,使用呈现的代码不会有任何行为,但对于真正的聊天应该有。整个事情都是一个模拟。

    【讨论】:

    • 1.观察者模式很有用。谢谢。 2. 我知道这与聊天无关。我只想知道在定义方法时,我应该创建什么样的方法成员以及对象之间应该如何交互。 3.据我所知,从repo 可以看出,User 没有可以通过调用approveAddRequest 和rejectAddRequest 类UserManager 来批准或拒绝AddRequest 的方法。跨度>
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多