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