Thursday, 26 December 2013

Mediator Design pattern - Implementation [Facebook]

Master Practical Software Architecture!

Subscribe to Ram N Java for clean coding tutorials, design pattern implementations, and real-world system architecture breakdowns!

🔔 Subscribe to Ram N Java

The Messaging Dilemma: Direct Peer Connections

In a social messaging platform where countless users send real-time text updates, allowing individual user objects to directly link and communicate with every other user creates an unmanageable web of dependencies.

If User A wants to send a message to User B or broadcast to a group of friends, having User A directly reference and manipulate each recipient's object creates tight coupling and makes scaling, logging, and permission checks practically impossible.

The Mediator Pattern Solution

The Mediator Design Pattern introduces a central dispatcher to regulate communication:

  • The Mediator Interface & Concrete Hub: An interface defining communication contracts, implemented by a central hub (e.g., FacebookGroupMediator), which maintains a registry of active users and coordinates message flow.
  • Colleague (User): Each participant retains a reference strictly to the mediator hub rather than to peers. Sending a message simply means calling mediator.sendMessage().
  • Centralized Dispatching: The mediator decides which users receive the message, handles delivery, and ensures the sender is excluded from receiving their own echoed text.

Why This Implementation Works So Well

Organizing your messaging architecture with a mediator delivers major architectural advantages:

  • Decoupled Participants: New users can join or leave the chat at runtime without requiring code modifications in other user instances.
  • Centralized Logic: Moderation, rate-limiting, and message formatting can be updated in a single mediator class.
  • Improved Maintainability: Replaces an unruly many-to-many dependency web with a clean, manageable hub-and-spoke model.

Related Tutorials from Ram N Java


Click here to watch in Youtube : https://www.youtube.com/watch?v=bayJB37kVR0

Click the below Image to Enlarge
Mediator Design pattern - Implementation [Facebook]

Mediator Design pattern - Implementation [Facebook] - Class Diagram




FacebookGroupMediator.java

public interface FacebookGroupMediator
{

public void sendMessage( String msg, User user );

void registerUser( User user );
}


FacebookGroupMediatorImpl.java

import java.util.ArrayList;
import java.util.List;

public class FacebookGroupMediatorImpl implements FacebookGroupMediator
{

private List<User> users;

public FacebookGroupMediatorImpl()
{
this.users = new ArrayList<User>();
}

@Override
public void registerUser( User user )
{
this.users.add(user);
}

@Override
public void sendMessage( String msg, User user )
{
for( User u : this.users )
{
// message should not be received by the user sending it
if( u != user )
{
u.receive(msg);
}
}
}

}

User.java

public abstract class User
{
protected FacebookGroupMediator mediator;
protected String       name;

public User( FacebookGroupMediator mediator, String name )
{
this.mediator = mediator;
this.name = name;
}

public abstract void send( String msg );

public abstract void receive( String msg );
}

UserImpl.java

public class UserImpl extends User
{

public UserImpl( FacebookGroupMediator mediator, String name )
{
super(mediator, name);
}

@Override
public void send( String msg )
{
System.out.println(this.name + ": Sending Message=" + msg+"\n");
mediator.sendMessage(msg, this);
}

@Override
public void receive( String msg )
{
System.out.println(this.name + ": Received Message:" + msg);
}

}

FacebookClient.java

public class FacebookClient
{

public static void main( String[] args )
{
FacebookGroupMediator facebookMediator = new FacebookGroupMediatorImpl();
User dave = new UserImpl(facebookMediator, "Dave");
User ram = new UserImpl(facebookMediator, "Ram");
User raj = new UserImpl(facebookMediator, "Raj");
User anu = new UserImpl(facebookMediator, "Anu");
User rahul = new UserImpl(facebookMediator, "Rahul");
User steve = new UserImpl(facebookMediator, "Steve");
User raju = new UserImpl(facebookMediator, "Raju");

facebookMediator.registerUser(dave);
facebookMediator.registerUser(ram);
facebookMediator.registerUser(raj);
facebookMediator.registerUser(anu);
facebookMediator.registerUser(rahul);
facebookMediator.registerUser(steve);
facebookMediator.registerUser(raju);
dave.send("ramj2ee.blogspot.com - this blog is very good blog ");
System.out.println("##############################################################################");
ram.send("what is Design Patterns? Please explain ");

}

}


Output

Dave: Sending Message=ramj2ee.blogspot.com - this blog is very good blog 

Ram: Received Message:ramj2ee.blogspot.com - this blog is very good blog 
Raj: Received Message:ramj2ee.blogspot.com - this blog is very good blog 
Anu: Received Message:ramj2ee.blogspot.com - this blog is very good blog 
Rahul: Received Message:ramj2ee.blogspot.com - this blog is very good blog 
Steve: Received Message:ramj2ee.blogspot.com - this blog is very good blog 
Raju: Received Message:ramj2ee.blogspot.com - this blog is very good blog 
##############################################################################
Ram: Sending Message=what is Design Patterns? Please explain 

Dave: Received Message:what is Design Patterns? Please explain 
Raj: Received Message:what is Design Patterns? Please explain 
Anu: Received Message:what is Design Patterns? Please explain 
Rahul: Received Message:what is Design Patterns? Please explain 
Steve: Received Message:what is Design Patterns? Please explain 
Raju: Received Message:what is Design Patterns? Please explain 

See also:

  • Mediator Design pattern - Introduction
  • Mediator Design pattern - When to Use
  • Mediator Design pattern - Real Time Example [Facebook]
  • Mediator Design pattern - Real Time Example [ATC]
  • Mediator Design pattern - Real Time Example [Chat Room]
  • Mediator Design pattern - Class Diagram
  • Mediator Design pattern - Implementation [Chat Room]
  • Mediator Design pattern - KeyPoints
  • All Design Patterns Links
  • No comments:

    Post a Comment

    Tutorials