[英]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.