Description
中文English
Pub/Sub pattern is a wide used pattern in system design. In this problem, you need to implement a pub/sub pattern to support user subscribes on a specific channel and get notification messages from subscribed channels.
There are 3 methods you need to implement:
subscribe(channel, user_id): Subscribe the given user to the given channel.unsubscribe(channel, user_id): Unsubscribe the given user from the given channel.publish(channel, message): You need to publish the message to the channel so that everyone subscribed on the channel will receive this message. CallPushNotification.notify(user_id, message)to push the message to the user.
Have you met this question in a real interview?
Example
subscribe("group1", 1)
publish("group1", "hello")
>> user 1 received "Hello"
subscribe("group1", 2)
publish("group1", "thank you")
>> user 1 received "thank you"
>> user 2 received "thank you"
unsubscribe("group2", 3)
>> user 3 is not in group2, do nothing
unsubscribe("group1", 1)
publish("group1", "thank you very much")
>> user 2 received "thank you very much"
publish("group2", "are you ok?")
>> # you don't need to push this message to anyone
If there are more than 1 user subscribed on the same channel, it doesn't matter the order of time users receiving the message. It's ok if you push the message to user 2 before user 1.
/* Definition of PushNotification
* class PushNotification {
* public static void notify(int user_id, String the_message)
* };
*/
//
public class PubSubPattern {
Map<String, Set<Integer>> channelTable;
public PubSubPattern(){
// Write your code here
channelTable = new HashMap<>();
}
/**
* @param channel: the channel's name
* @param user_id: the user who subscribes the channel
* @return: nothing
*/
public void subscribe(String channel, int user_id) {
// Write your code here
Set<Integer> users = channelTable.getOrDefault(channel, new HashSet<>());
users.add(user_id);
channelTable.put(channel, users);
}
/**
* @param channel: the channel's name
* @param user_id: the user who unsubscribes the channel
* @return: nothing
*/
public void unsubscribe(String channel, int user_id) {
// Write your code here
if (channelTable.containsKey(channel)) {
Set<Integer> users = channelTable.get(channel);
users.remove(user_id);
}
}
/**
* @param channel: the channel's name
* @param message: the message need to be delivered to the channel's subscribers
* @return: nothing
*/
public void publish(String channel, String message) {
// Write your code here
if (channelTable.containsKey(channel)) {
Set<Integer> users = channelTable.get(channel);
for (Integer user : users) {
PushNotification.notify(user, message);
}
}
}
}
No comments:
Post a Comment