繁体   English   中英

设计类之间的交互-关于破解编码面试的解决方案8.7

[英]Design the interaction between classes - regarding the Solution 8.7 of 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之后,将不再执行任何操作来真正处理此请求。

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

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

这是GoF针对事件处理引入的最佳做法。

您在此处呈现的内容与聊天无关。 它只是处理用户交互的工具。

至于最后一个问题:您看不到完整的代码,因此您不知道从何处调用它。 您应该首先找到完整的源代码。 而且您是对的,使用所提供的代码不会执行任何操作,但是对于真正的聊天应该如此。 这整个过程是一个模拟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM