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

时间:2016-05-22 13:47:48

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

我学习了“破解编码面试”一书,并对第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后,不会再执行任何操作来真正处理此请求。

而且,我想知道:如果类之间的每个交互都是这样的(即,来自不同类的许多方法都会多次调用和调用)?

1 个答案:

答案 0 :(得分:0)

你正在寻找的是" Observer"图案。

GoF为事件处理引入的最佳做法。

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

至于你上一个问题:你没有看到完整的代码,所以你无法知道它的来源。您应该首先找到完整的源代码。而你是对的,有了呈现的代码,不会有任何行为,但对于真正的聊天应该有。这一切都是模拟的。