//
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