SSISO Community

시소당

디자인패턴 - Observer Pattern in Java 2

//[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.util.ArrayList;
import  java.util.Iterator;

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  RunObserverPattern  {
    public  static  void  main(String[]  arguments)  {
        System.out.println("Example  for  the  Observer  pattern");
        System.out.println("This  demonstration  uses  a  central  observable");
        System.out.println("  object  to  send  change  notifications  to  several");
        System.out.println("  JPanels  in  a  GUI.  Each  JPanel  is  an  Observer,");
        System.out.println("  receiving  notifcations  when  there  has  been  some");
        System.out.println("  change  in  the  shared  Task  that  is  being  edited.");
        System.out.println();

        System.out.println("Creating  the  ObserverGui");
        ObserverGui  application  =  new  ObserverGui();
        application.createGui();
    }
}

class  Task  {
    private  String  name  =  "";

    private  String  notes  =  "";

    private  double  timeRequired;

    public  Task()  {
    }

    public  Task(String  newName,  String  newNotes,  double  newTimeRequired)  {
        name  =  newName;
        notes  =  newNotes;
        timeRequired  =  newTimeRequired;
    }

    public  String  getName()  {
        return  name;
    }

    public  String  getNotes()  {
        return  notes;
    }

    public  double  getTimeRequired()  {
        return  timeRequired;
    }

    public  void  setName(String  newName)  {
        name  =  newName;
    }

    public  void  setTimeRequired(double  newTimeRequired)  {
        timeRequired  =  newTimeRequired;
    }

    public  void  setNotes(String  newNotes)  {
        notes  =  newNotes;
    }

    public  String  toString()  {
        return  name  +  "  "  +  notes;
    }
}

class  TaskChangeObservable  {
    private  ArrayList  observers  =  new  ArrayList();

    public  void  addTaskChangeObserver(TaskChangeObserver  observer)  {
        if  (!observers.contains(observer))  {
            observers.add(observer);
        }
    }

    public  void  removeTaskChangeObserver(TaskChangeObserver  observer)  {
        observers.remove(observer);
    }

    public  void  selectTask(Task  task)  {
        Iterator  elements  =  observers.iterator();
        while  (elements.hasNext())  {
            ((TaskChangeObserver)  elements.next()).taskSelected(task);
        }
    }

    public  void  addTask(Task  task)  {
        Iterator  elements  =  observers.iterator();
        while  (elements.hasNext())  {
            ((TaskChangeObserver)  elements.next()).taskAdded(task);
        }
    }

    public  void  updateTask(Task  task)  {
        Iterator  elements  =  observers.iterator();
        while  (elements.hasNext())  {
            ((TaskChangeObserver)  elements.next()).taskChanged(task);
        }
    }
}

interface  TaskChangeObserver  {
    public  void  taskAdded(Task  task);

    public  void  taskChanged(Task  task);

    public  void  taskSelected(Task  task);
}

class  TaskEditorPanel  extends  JPanel  implements  ActionListener,
        TaskChangeObserver  {
    private  JPanel  controlPanel,  editPanel;

    private  JButton  add,  update,  exit;

    private  JTextField  taskName,  taskNotes,  taskTime;

    private  TaskChangeObservable  notifier;

    private  Task  editTask;

    public  TaskEditorPanel(TaskChangeObservable  newNotifier)  {
        notifier  =  newNotifier;
        createGui();
    }

    public  void  createGui()  {
        setLayout(new  BorderLayout());
        editPanel  =  new  JPanel();
        editPanel.setLayout(new  GridLayout(3,  2));
        taskName  =  new  JTextField(20);
        taskNotes  =  new  JTextField(20);
        taskTime  =  new  JTextField(20);
        editPanel.add(new  JLabel("Task  Name"));
        editPanel.add(taskName);
        editPanel.add(new  JLabel("Task  Notes"));
        editPanel.add(taskNotes);
        editPanel.add(new  JLabel("Time  Required"));
        editPanel.add(taskTime);

        controlPanel  =  new  JPanel();
        add  =  new  JButton("Add  Task");
        update  =  new  JButton("Update  Task");
        exit  =  new  JButton("Exit");
        controlPanel.add(add);
        controlPanel.add(update);
        controlPanel.add(exit);
        add.addActionListener(this);
        update.addActionListener(this);
        exit.addActionListener(this);
        add(controlPanel,  BorderLayout.SOUTH);
        add(editPanel,  BorderLayout.CENTER);
    }

    public  void  setTaskChangeObservable(TaskChangeObservable  newNotifier)  {
        notifier  =  newNotifier;
    }

    public  void  actionPerformed(ActionEvent  event)  {
        Object  source  =  event.getSource();
        if  (source  ==  add)  {
            double  timeRequired  =  0.0;
            try  {
                timeRequired  =  Double.parseDouble(taskTime.getText());
            }  catch  (NumberFormatException  exc)  {
            }
            notifier.addTask(new  Task(taskName.getText(),  taskNotes.getText(),
                    timeRequired));
        }  else  if  (source  ==  update)  {
            editTask.setName(taskName.getText());
            editTask.setNotes(taskNotes.getText());
            try  {
                editTask
                        .setTimeRequired(Double.parseDouble(taskTime.getText()));
            }  catch  (NumberFormatException  exc)  {
            }
            notifier.updateTask(editTask);
        }  else  if  (source  ==  exit)  {
            System.exit(0);
        }

    }

    public  void  taskAdded(Task  task)  {
    }

    public  void  taskChanged(Task  task)  {
    }

    public  void  taskSelected(Task  task)  {
        editTask  =  task;
        taskName.setText(task.getName());
        taskNotes.setText(task.getNotes());
        taskTime.setText(""  +  task.getTimeRequired());
    }
}

class  TaskHistoryPanel  extends  JPanel  implements  TaskChangeObserver  {
    private  JTextArea  displayRegion;

    public  TaskHistoryPanel()  {
        createGui();
    }

    public  void  createGui()  {
        setLayout(new  BorderLayout());
        displayRegion  =  new  JTextArea(10,  40);
        displayRegion.setEditable(false);
        add(new  JScrollPane(displayRegion));
    }

    public  void  taskAdded(Task  task)  {
        displayRegion.append("Created  task  "  +  task  +  "\n");
    }

    public  void  taskChanged(Task  task)  {
        displayRegion.append("Updated  task  "  +  task  +  "\n");
    }

    public  void  taskSelected(Task  task)  {
        displayRegion.append("Selected  task  "  +  task  +  "\n");
    }
}

class  TaskSelectorPanel  extends  JPanel  implements  ActionListener,
        TaskChangeObserver  {
    private  JComboBox  selector  =  new  JComboBox();

    private  TaskChangeObservable  notifier;

    public  TaskSelectorPanel(TaskChangeObservable  newNotifier)  {
        notifier  =  newNotifier;
        createGui();
    }

    public  void  createGui()  {
        selector  =  new  JComboBox();
        selector.addActionListener(this);
        add(selector);
    }

    public  void  actionPerformed(ActionEvent  evt)  {
        notifier.selectTask((Task)  selector.getSelectedItem());
    }

    public  void  setTaskChangeObservable(TaskChangeObservable  newNotifier)  {
        notifier  =  newNotifier;
    }

    public  void  taskAdded(Task  task)  {
        selector.addItem(task);
    }

    public  void  taskChanged(Task  task)  {
    }

    public  void  taskSelected(Task  task)  {
    }
}

class  ObserverGui  {
    public  void  createGui()  {
        JFrame  mainFrame  =  new  JFrame("Observer  Pattern  Example");
        Container  content  =  mainFrame.getContentPane();
        content.setLayout(new  BoxLayout(content,  BoxLayout.Y_AXIS));
        TaskChangeObservable  observable  =  new  TaskChangeObservable();
        TaskSelectorPanel  select  =  new  TaskSelectorPanel(observable);
        TaskHistoryPanel  history  =  new  TaskHistoryPanel();
        TaskEditorPanel  edit  =  new  TaskEditorPanel(observable);
        observable.addTaskChangeObserver(select);
        observable.addTaskChangeObserver(history);
        observable.addTaskChangeObserver(edit);
        observable.addTask(new  Task());
        content.add(select);
        content.add(history);
        content.add(edit);
        mainFrame.addWindowListener(new  WindowCloseManager());
        mainFrame.pack();
        mainFrame.setVisible(true);
    }

    private  class  WindowCloseManager  extends  WindowAdapter  {
        public  void  windowClosing(WindowEvent  evt)  {
            System.exit(0);
        }
    }
}

782 view

4.0 stars