//
Purpose.  Mediator design pattern
//
1. Create an "intermediary" that decouples "senders" from
"receivers"
// 2. Producers are coupled only to the
Mediator
// 3. Consumers are coupled only to the Mediator
// 4. The
Mediator arbitrates the storing and retrieving of messages
class
Mediator {                        // 1.
The "intermediary" 
  
private boolean slotFull = false;   
// 4. The Mediator arbitrates
  
private int     number;
   public synchronized void storeMessage( int
num ) {
      while (slotFull ==
true)          // no room for another
message
         try { wait(); }
catch (InterruptedException e ) { }
     
slotFull = true;
     
number = num;
     
notifyAll();
   }
   public synchronized int retrieveMessage()
{
      while (slotFull ==
false)         // no message to
retrieve
         try { wait(); }
catch (InterruptedException e ) { }
     
slotFull = false;
     
notifyAll();
      return
number;
}  }
class
Producer extends Thread {
  
private Mediator med;               
// 2. Producers are coupled only to
   private int      id;                 //    the Mediator
  
private static int num = 1;
  
public Producer( Mediator m ) { med = m;  id = num++; }
  
public void run() {
     
int num;
      while (true)
{
         med.storeMessage( num =
(int)(Math.random()*100) );
        
System.out.print( "p" + id + "-" + num + "   " );
}  }  }
class
Consumer extends Thread {
  
private Mediator med;               
// 3. Consumers are coupled only to
   private int      id;                 //    the Mediator
   private static int num = 1;
   public Consumer( Mediator m ) { med =
m;  id = num++; }
   public void run() {
      while (true) {
         System.out.print( "c" + id
+ "-" + med.retrieveMessage() + "   " );
}  }  }
class MediatorDemo {
   public static void main( String[] args )
{
      Mediator mb = new
Mediator();
      new Producer( mb
).start();
      new Producer( mb
).start();
      new Consumer( mb
).start();
      new Consumer( mb
).start();
      new Consumer( mb
).start();
      new Consumer( mb ).start();
}  }
// p1-87   c1-87  
p2-37   c3-37   p1-28  
c2-28   p2-58   c1-58  
p1-18   c4-18
// p2-42   c3-42  
p1-3   c2-3   p2-11  
c3-11   p1-72   c2-72  
p2-75   c3-75
// p1-93   c4-93  
p2-52   c1-52   p1-21  
c3-21   p2-80   c4-80  
p1-96   c2-96