Design Pattern Java

//[C] 2002 Sun Microsystems, Inc.---
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.Serializable;
import java.util.ArrayList;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class RunMediatorPattern {
    public static void main(String [] arguments){
        System.out.println("Example for the Mediator pattern");
        System.out.println("In this demonstration, the ContactMediatorImpl class will");
        System.out.println(" coordinate updates between three controls in a GUI - the");
        System.out.println(" ContactDisplayPanel, the ContactEditorPanel, and the");
        System.out.println(" ContactSelectorPanel. As its name suggests, the Mediator");
        System.out.println(" mediates the activity between the elements of the GUI,");
        System.out.println(" translating method calls from one panel into the appropriate");
        System.out.println(" method calls on the other GUI components.");
        
        Contact contact = new ContactImpl("", "", "", "");
        Contact contact1 = new ContactImpl("Duke", "", "Java Advocate", "The Patterns Guild");
        ContactMediatorImpl mediator = new ContactMediatorImpl();
        mediator.addContact(contact);
        mediator.addContact(contact1);
        MediatorGui gui = new MediatorGui();
        gui.setContactMediator(mediator);
        gui.createGui();
        
        
    }
}
class ContactEditorPanel extends JPanel implements ActionListener{
    private ContactMediator mediator;
    private JTextField firstName, lastName, title, organization;
    private JButton create, update;
    
    public ContactEditorPanel(){
        createGui();
    }
    public ContactEditorPanel(ContactMediator newMediator){
        setContactMediator(newMediator);
        createGui();
    }
    public void createGui(){
        setLayout(new BorderLayout());
        
        JPanel editor = new JPanel();
        editor.setLayout(new GridLayout(4, 2));
        editor.add(new JLabel("First Name:"));
        firstName = new JTextField(20);
        editor.add(firstName);
        editor.add(new JLabel("Last Name:"));
        lastName = new JTextField(20);
        editor.add(lastName);
        editor.add(new JLabel("Title:"));
        title = new JTextField(20);
        editor.add(title);
        editor.add(new JLabel("Organization:"));
        organization = new JTextField(20);
        editor.add(organization);
        add(editor, BorderLayout.CENTER);
        
        JPanel control = new JPanel();
        create = new JButton("Create Contact");
        update = new JButton("Update Contact");
        create.addActionListener(this);
        update.addActionListener(this);
        control.add(create);
        control.add(update);
        add(control, BorderLayout.SOUTH);
    }
    public void actionPerformed(ActionEvent evt){
        Object source = evt.getSource();
        if (source == create){
            createContact();
        }
        else if (source == update){
            updateContact();
        }
    }
    
    public void createContact(){
        mediator.createContact(firstName.getText(), lastName.getText(),
            title.getText(), organization.getText());
    }
    public void updateContact(){
        mediator.updateContact(firstName.getText(), lastName.getText(),
            title.getText(), organization.getText());
    }
    
    public void setContactFields(Contact contact){
        firstName.setText(contact.getFirstName());
        lastName.setText(contact.getLastName());
        title.setText(contact.getTitle());
        organization.setText(contact.getOrganization());
    }
    public void setContactMediator(ContactMediator newMediator){
        mediator = newMediator;
    }
}
class ContactMediatorImpl implements ContactMediator{
    private ContactDisplayPanel display;
    private ContactEditorPanel editor;
    private ContactSelectorPanel selector;
    private ArrayList contacts = new ArrayList();
    private int contactIndex;
    
    public void setContactDisplayPanel(ContactDisplayPanel displayPanel){
        display = displayPanel;
    }
    public void setContactEditorPanel(ContactEditorPanel editorPanel){
        editor = editorPanel;
    }
    public void setContactSelectorPanel(ContactSelectorPanel selectorPanel){
        selector = selectorPanel;
    }
    
    public void createContact(String firstName, String lastName, String title, String organization){
        Contact newContact = new ContactImpl(firstName, lastName, title, organization);
        addContact(newContact);
        selector.addContact(newContact);
        display.contactChanged(newContact);
    }
    public void updateContact(String firstName, String lastName, String title, String organization){
        Contact updateContact = (Contact)contacts.get(contactIndex);
        if (updateContact != null){
            updateContact.setFirstName(firstName);
            updateContact.setLastName(lastName);
            updateContact.setTitle(title);
            updateContact.setOrganization(organization);
            display.contactChanged(updateContact);
        }
    }
    public void selectContact(Contact contact){
        if (contacts.contains(contact)){
            contactIndex = contacts.indexOf(contact);
            display.contactChanged(contact);
            editor.setContactFields(contact);
        }
    }
    public Contact [] getAllContacts(){
        return (Contact [])contacts.toArray(new Contact[1]);
    }
    public void addContact(Contact contact){
        if (!contacts.contains(contact)){
            contacts.add(contact);
        }
    }
}
class ContactDisplayPanel extends JPanel{
    private ContactMediator mediator;
    private JTextArea displayRegion;
    
    public ContactDisplayPanel(){
        createGui();
    }
    public ContactDisplayPanel(ContactMediator newMediator){
        setContactMediator(newMediator);
        createGui();
    }
    public void createGui(){
        setLayout(new BorderLayout());
        displayRegion = new JTextArea(10, 40);
        displayRegion.setEditable(false);
        add(new JScrollPane(displayRegion));
    }
    public void contactChanged(Contact contact){
        displayRegion.setText(
            "Contact\n\tName: " + contact.getFirstName() +
            " " + contact.getLastName() + "\n\tTitle: " +
            contact.getTitle() + "\n\tOrganization: " +
            contact.getOrganization());
    }
    public void setContactMediator(ContactMediator newMediator){
        mediator = newMediator;
    }
}
class ContactSelectorPanel extends JPanel implements ActionListener{
    private ContactMediator mediator;
    private JComboBox selector;
    
    public ContactSelectorPanel(){
        createGui();
    }
    public ContactSelectorPanel(ContactMediator newMediator){
        setContactMediator(newMediator);
        createGui();
    }
    
    public void createGui(){
        selector = new JComboBox(mediator.getAllContacts());
        selector.addActionListener(this);
        add(selector);
    }
    
    public void actionPerformed(ActionEvent evt){
        mediator.selectContact((Contact)selector.getSelectedItem());
    }
    public void addContact(Contact contact){
        selector.addItem(contact);
        selector.setSelectedItem(contact);
    }
    public void setContactMediator(ContactMediator newMediator){
        mediator = newMediator;
    }
}
class MediatorGui{
    private ContactMediator mediator;
    
    public void setContactMediator(ContactMediator newMediator){ mediator = newMediator; }
    
    public void createGui(){
        JFrame mainFrame = new JFrame("Mediator example");
        Container content = mainFrame.getContentPane();
        content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
        ContactSelectorPanel select = new ContactSelectorPanel(mediator);
        ContactDisplayPanel display = new ContactDisplayPanel(mediator);
        ContactEditorPanel edit = new ContactEditorPanel(mediator);
        content.add(select);
        content.add(display);
        content.add(edit);
        mediator.setContactSelectorPanel(select);
        mediator.setContactDisplayPanel(display);
        mediator.setContactEditorPanel(edit);
        mainFrame.addWindowListener(new WindowCloseManager());
        mainFrame.pack();
        mainFrame.setVisible(true);
    }
    private class WindowCloseManager extends WindowAdapter{
        public void windowClosing(WindowEvent evt){
            System.exit(0);
        }
    }
}
interface ContactMediator{
    public void setContactDisplayPanel(ContactDisplayPanel displayPanel);
    public void setContactEditorPanel(ContactEditorPanel editorPanel);
    public void setContactSelectorPanel(ContactSelectorPanel selectorPanel);
    public void createContact(String firstName, String lastName, String title, String organization);
    public void updateContact(String firstName, String lastName, String title, String organization);
    public Contact [] getAllContacts();
    public void selectContact(Contact contact);
}
interface Contact extends Serializable{
    public static final String SPACE = " ";
    public String getFirstName();
    public String getLastName();
    public String getTitle();
    public String getOrganization();
    
    public void setFirstName(String newFirstName);
    public void setLastName(String newLastName);
    public void setTitle(String newTitle);
    public void setOrganization(String newOrganization);
}
class ContactImpl implements Contact{
    private String firstName;
    private String lastName;
    private String title;
    private String organization;
    
    public ContactImpl(){}
    public ContactImpl(String newFirstName, String newLastName,
        String newTitle, String newOrganization){
            firstName = newFirstName;
            lastName = newLastName;
            title = newTitle;
            organization = newOrganization;
    }
    
    public String getFirstName(){ return firstName; }
    public String getLastName(){ return lastName; }
    public String getTitle(){ return title; }
    public String getOrganization(){ return organization; }
    
    public void setFirstName(String newFirstName){ firstName = newFirstName; }
    public void setLastName(String newLastName){ lastName = newLastName; }
    public void setTitle(String newTitle){ title = newTitle; }
    public void setOrganization(String newOrganization){ organization = newOrganization; }
    
    public String toString(){
        return firstName + SPACE + lastName;
    }
}