簡體   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