// Purpose.?Mediator and Observer demo
//
// Observer -
// 1. Sender is coupled to a Receiver interface
// 2. Receivers register with Sender
// 3. Sender broadcasts to all Receivers
//
// Mediator -
// 4. Mediator implements Receiver interface
// 5. Mediator registers with Senders
// 6. Receivers register with Mediator
// 7. Senders send to Mediator
// 8. Mediator sends to Receivers

import java.awt.*;
import java.awt.event.*;

public class MediatorObserverDemo {
static final int ODD = 1, EVEN = 2, THRE = 3;

interface Observer { public void update( String s ); }

static class Mediator extends FrameClose implements ActionListener { // 4 \\
牋牋?private Observer[] odd = new Observer[2], even = new Observer[2], // 1 \\
牋牋牋牋 thre = new Observer[2];
牋牋?private int numO = 0, numE = 0, numT = 0;
牋牋?public Mediator( String str ) { super( str ); }
牋牋? public void register( Observer o, int type ) {
牋牋牋牋 if (type == ODD)牋牋牋 odd[numO++]?= o;
牋牋牋牋 else if (type == EVEN) even[numE++] = o;
牋牋牋牋 else if (type == THRE) thre[numT++] = o;
牋牋?}
牋牋?public void actionPerformed( ActionEvent e ) {
牋牋牋牋 if (Integer.parseInt(e.getActionCommand()) % 2 == 1)牋牋牋牋 // 3,8 \\
牋牋牋牋牋?for (int i=0; i < numO; i++) odd[i].update( e.getActionCommand() );
牋牋牋牋 else if (Integer.parseInt(e.getActionCommand()) % 2 == 0)
牋牋牋牋牋?for (int i=0; i < numE; i++) even[i].update( e.getActionCommand() );
牋牋牋牋 if (Integer.parseInt(e.getActionCommand()) % 3 == 0)
牋牋牋牋牋?for (int i=0; i < numT; i++) thre[i].update( e.getActionCommand() );
}?}

static class Subscriber extends TextArea implements Observer {
牋牋?public void update( String s ) { append( s + '\n' ); } }

public static void main( String[] args ) {
牋牋?Mediatormediator = new Mediator( "MediatorObserverDemo" );
牋牋? Subscriber sub;

牋牋? Panel top = new Panel();
牋牋? Button btn;
牋牋?for (int i=1; i < 10; i++) {
牋牋牋牋 btn = new Button( "" + i );
牋牋牋牋 btn.addActionListener( mediator );牋牋牋牋牋牋牋牋?牋牋牋牋?/span>// 5,7 \\
牋牋牋牋 top.add( btn ); }
牋牋? Panel center = new Panel();
牋牋? center.setLayout( new GridLayout( 1, 3 ) );牋牋牋牋牋牋牋牋牋牋 // 2,6 \\
牋牋?sub = new Subscriber(); center.add( sub ); mediator.register( sub, ODD );
牋牋?sub = new Subscriber(); center.add( sub ); mediator.register( sub, EVEN );
牋牋?sub = new Subscriber(); center.add( sub ); mediator.register( sub, THRE );

牋牋?mediator.add( top, BorderLayout.NORTH );
牋牋?mediator.add( center, BorderLayout.CENTER );
牋牋?mediator.setSize( 250, 200 );
牋牋? mediator.setVisible( true );
}? }