<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FObserver_Pattern</id>
		<title>Java/Design Pattern/Observer Pattern - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FObserver_Pattern"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Observer_Pattern&amp;action=history"/>
		<updated>2026-04-22T05:01:43Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Design_Pattern/Observer_Pattern&amp;diff=7813&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Observer_Pattern&amp;diff=7813&amp;oldid=prev"/>
				<updated>2010-06-01T06:50:51Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:50, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Design_Pattern/Observer_Pattern&amp;diff=7812&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Observer_Pattern&amp;diff=7812&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== A simple demo of Observable and Observer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.&lt;br /&gt;
 * All rights reserved. Software written by Ian F. Darwin and others.&lt;br /&gt;
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;quot;&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED&lt;br /&gt;
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS&lt;br /&gt;
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 * &lt;br /&gt;
 * Java, the Duke mascot, and all variants of Sun&amp;quot;s Java &amp;quot;steaming coffee&lt;br /&gt;
 * cup&amp;quot; logo are trademarks of Sun Microsystems. Sun&amp;quot;s, and James Gosling&amp;quot;s,&lt;br /&gt;
 * pioneering role in inventing and promulgating (and standardizing) the Java &lt;br /&gt;
 * language and environment is gratefully acknowledged.&lt;br /&gt;
 * &lt;br /&gt;
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&amp;amp;T, for&lt;br /&gt;
 * inventing predecessor languages C and C++ is also gratefully acknowledged.&lt;br /&gt;
 */&lt;br /&gt;
import java.util.Observable;&lt;br /&gt;
import java.util.Observer;&lt;br /&gt;
/**&lt;br /&gt;
 * A simple demo of Observable-&amp;gt;Observer&lt;br /&gt;
 * &lt;br /&gt;
 * @author Ian Darwin&lt;br /&gt;
 * @version $Id: ObservDemo.java,v 1.3 2003/12/29 19:52:22 ian Exp $&lt;br /&gt;
 */&lt;br /&gt;
public class ObservDemo extends Object {&lt;br /&gt;
  MyView view;&lt;br /&gt;
  MyModel model;&lt;br /&gt;
  public ObservDemo() {&lt;br /&gt;
    view = new MyView();&lt;br /&gt;
    model = new MyModel();&lt;br /&gt;
    model.addObserver(view);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] av) {&lt;br /&gt;
    ObservDemo me = new ObservDemo();&lt;br /&gt;
    me.demo();&lt;br /&gt;
  }&lt;br /&gt;
  public void demo() {&lt;br /&gt;
    model.changeSomething();&lt;br /&gt;
  }&lt;br /&gt;
  /** The Observer normally maintains a view on the data */&lt;br /&gt;
  class MyView implements Observer {&lt;br /&gt;
    /** For now, we just print the fact that we got notified. */&lt;br /&gt;
    public void update(Observable obs, Object x) {&lt;br /&gt;
      System.out.println(&amp;quot;update(&amp;quot; + obs + &amp;quot;,&amp;quot; + x + &amp;quot;);&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /** The Observable normally maintains the data */&lt;br /&gt;
  class MyModel extends Observable {&lt;br /&gt;
    public void changeSomething() {&lt;br /&gt;
      // Notify observers of change&lt;br /&gt;
      setChanged();&lt;br /&gt;
      notifyObservers();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementing a Simple Event Notifier ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
import java.util.Observable;&lt;br /&gt;
import java.util.Observer;&lt;br /&gt;
class MyModel extends Observable {&lt;br /&gt;
  public synchronized void setChanged() {&lt;br /&gt;
    super.setChanged();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class Main {&lt;br /&gt;
  public static void main(String[] argv) throws Exception {&lt;br /&gt;
    MyModel model = new MyModel();&lt;br /&gt;
    model.addObserver(new Observer() {&lt;br /&gt;
      public void update(Observable o, Object arg) {&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    model.setChanged();&lt;br /&gt;
    Object arg = &amp;quot;new information&amp;quot;;&lt;br /&gt;
    model.notifyObservers(arg);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observable and observer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
import java.util.Observable;&lt;br /&gt;
import java.util.Observer;&lt;br /&gt;
public class MessageBoard extends Observable {&lt;br /&gt;
  private String message;&lt;br /&gt;
  public String getMessage() {&lt;br /&gt;
    return message;&lt;br /&gt;
  }&lt;br /&gt;
  public void changeMessage(String message) {&lt;br /&gt;
    this.message = message;&lt;br /&gt;
    setChanged();&lt;br /&gt;
    notifyObservers(message);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    MessageBoard board = new MessageBoard();&lt;br /&gt;
    Student bob = new Student();&lt;br /&gt;
    Student joe = new Student();&lt;br /&gt;
    board.addObserver(bob);&lt;br /&gt;
    board.addObserver(joe);&lt;br /&gt;
    board.changeMessage(&amp;quot;More Homework!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Student implements Observer {&lt;br /&gt;
  public void update(Observable o, Object arg) {&lt;br /&gt;
    System.out.println(&amp;quot;Message board changed: &amp;quot; + arg);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observer Pattern - Example in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
/*&lt;br /&gt;
Software Architecture Design Patterns in Java&lt;br /&gt;
by Partha Kuchana &lt;br /&gt;
Auerbach Publications&lt;br /&gt;
*/&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.Font;&lt;br /&gt;
import java.awt.GridBagConstraints;&lt;br /&gt;
import java.awt.GridBagLayout;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.KeyEvent;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.DataOutputStream;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.util.Calendar;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
import java.util.StringTokenizer;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JComboBox;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JTextArea;&lt;br /&gt;
import javax.swing.SwingUtilities;&lt;br /&gt;
import javax.swing.UIManager;&lt;br /&gt;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;&lt;br /&gt;
public class MonthlyReport extends JFrame implements Observer {&lt;br /&gt;
  public static final String newline = &amp;quot;\n&amp;quot;;&lt;br /&gt;
  private JPanel panel;&lt;br /&gt;
  private JLabel lblTransactions;&lt;br /&gt;
  private JTextArea taTransactions;&lt;br /&gt;
  private ReportManager objReportManager;&lt;br /&gt;
  public MonthlyReport(ReportManager inp_objReportManager) throws Exception {&lt;br /&gt;
    super(&amp;quot;Observer Pattern - Example&amp;quot;);&lt;br /&gt;
    objReportManager = inp_objReportManager;&lt;br /&gt;
    // Create controls&lt;br /&gt;
    panel = new JPanel();&lt;br /&gt;
    taTransactions = new JTextArea(5, 40);&lt;br /&gt;
    taTransactions.setFont(new Font(&amp;quot;Serif&amp;quot;, Font.PLAIN, 14));&lt;br /&gt;
    taTransactions.setLineWrap(true);&lt;br /&gt;
    taTransactions.setWrapStyleWord(true);&lt;br /&gt;
    //Create Labels&lt;br /&gt;
    lblTransactions = new JLabel(&amp;quot;Current Month Transactions&amp;quot;);&lt;br /&gt;
    //For layout purposes, put the buttons in a separate panel&lt;br /&gt;
    JPanel buttonPanel = new JPanel();&lt;br /&gt;
    buttonPanel.add(lblTransactions);&lt;br /&gt;
    buttonPanel.add(taTransactions);&lt;br /&gt;
    Container contentPane = getContentPane();&lt;br /&gt;
    contentPane.add(buttonPanel, BorderLayout.CENTER);&lt;br /&gt;
    try {&lt;br /&gt;
      UIManager.setLookAndFeel(new WindowsLookAndFeel());&lt;br /&gt;
      SwingUtilities.updateComponentTreeUI(MonthlyReport.this);&lt;br /&gt;
    } catch (Exception ex) {&lt;br /&gt;
      System.out.println(ex);&lt;br /&gt;
    }&lt;br /&gt;
    setSize(400, 300);&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
    objReportManager.register(this);&lt;br /&gt;
  }&lt;br /&gt;
  public void refreshData(Observable subject) {&lt;br /&gt;
    if (subject == objReportManager) {&lt;br /&gt;
      //get subject&amp;quot;s state&lt;br /&gt;
      String department = objReportManager.getDepartment();&lt;br /&gt;
      lblTransactions.setText(&amp;quot;Current Month Transactions - &amp;quot;&lt;br /&gt;
          + department);&lt;br /&gt;
      Vector trnList = getCurrentMonthTransactions(department);&lt;br /&gt;
      String content = &amp;quot;&amp;quot;;&lt;br /&gt;
      for (int i = 0; i &amp;lt; trnList.size(); i++) {&lt;br /&gt;
        content = content + trnList.elementAt(i).toString() + &amp;quot;\n&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
      taTransactions.setText(content);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private Vector getCurrentMonthTransactions(String department) {&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    FileUtil futil = new FileUtil();&lt;br /&gt;
    Vector allRows = futil.fileToVector(&amp;quot;Transactions.dat&amp;quot;);&lt;br /&gt;
    //current month&lt;br /&gt;
    Calendar cal = Calendar.getInstance();&lt;br /&gt;
    cal.setTime(new Date());&lt;br /&gt;
    int month = cal.get(Calendar.MONTH) + 1;&lt;br /&gt;
    String searchStr = department + &amp;quot;,&amp;quot; + month + &amp;quot;,&amp;quot;;&lt;br /&gt;
    int j = 1;&lt;br /&gt;
    for (int i = 0; i &amp;lt; allRows.size(); i++) {&lt;br /&gt;
      String str = (String) allRows.elementAt(i);&lt;br /&gt;
      if (str.indexOf(searchStr) &amp;gt; -1) {&lt;br /&gt;
        StringTokenizer st = new StringTokenizer(str, &amp;quot;,&amp;quot;);&lt;br /&gt;
        st.nextToken();//bypass the department&lt;br /&gt;
        str = &amp;quot;   &amp;quot; + j + &amp;quot;. &amp;quot; + st.nextToken() + &amp;quot;/&amp;quot; + st.nextToken()&lt;br /&gt;
            + &amp;quot;~~~&amp;quot; + st.nextToken() + &amp;quot;Items&amp;quot; + &amp;quot;~~~&amp;quot;&lt;br /&gt;
            + st.nextToken() + &amp;quot; Dollars&amp;quot;;&lt;br /&gt;
        j++;&lt;br /&gt;
        v.addElement(str);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return v;&lt;br /&gt;
  }&lt;br /&gt;
}// end of class&lt;br /&gt;
class ReportManager extends JFrame implements Observable {&lt;br /&gt;
  public static final String newline = &amp;quot;\n&amp;quot;;&lt;br /&gt;
  public static final String SET_OK = &amp;quot;OK&amp;quot;;&lt;br /&gt;
  public static final String EXIT = &amp;quot;Exit&amp;quot;;&lt;br /&gt;
  private JPanel pSearchCriteria;&lt;br /&gt;
  private JComboBox cmbDepartmentList;&lt;br /&gt;
  private JButton btnOK, btnExit;&lt;br /&gt;
  private Vector observersList;&lt;br /&gt;
  private String department;&lt;br /&gt;
  public ReportManager() throws Exception {&lt;br /&gt;
    super(&amp;quot;Observer Pattern - Example&amp;quot;);&lt;br /&gt;
    observersList = new Vector();&lt;br /&gt;
    // Create controls&lt;br /&gt;
    cmbDepartmentList = new JComboBox();&lt;br /&gt;
    btnOK = new JButton(ReportManager.SET_OK);&lt;br /&gt;
    btnOK.setMnemonic(KeyEvent.VK_S);&lt;br /&gt;
    btnExit = new JButton(ReportManager.EXIT);&lt;br /&gt;
    btnExit.setMnemonic(KeyEvent.VK_X);&lt;br /&gt;
    pSearchCriteria = new JPanel();&lt;br /&gt;
    //Create Labels&lt;br /&gt;
    JLabel lblDepartmentList = new JLabel(&amp;quot;Select a Department:&amp;quot;);&lt;br /&gt;
    ButtonHandler vf = new ButtonHandler(this);&lt;br /&gt;
    btnOK.addActionListener(vf);&lt;br /&gt;
    btnExit.addActionListener(vf);&lt;br /&gt;
    JPanel buttonPanel = new JPanel();&lt;br /&gt;
    //----------------------------------------------&lt;br /&gt;
    GridBagLayout gridbag = new GridBagLayout();&lt;br /&gt;
    buttonPanel.setLayout(gridbag);&lt;br /&gt;
    GridBagConstraints gbc = new GridBagConstraints();&lt;br /&gt;
    buttonPanel.add(lblDepartmentList);&lt;br /&gt;
    buttonPanel.add(cmbDepartmentList);&lt;br /&gt;
    buttonPanel.add(btnOK);&lt;br /&gt;
    buttonPanel.add(btnExit);&lt;br /&gt;
    gbc.insets.top = 5;&lt;br /&gt;
    gbc.insets.bottom = 5;&lt;br /&gt;
    gbc.insets.left = 5;&lt;br /&gt;
    gbc.insets.right = 5;&lt;br /&gt;
    gbc.gridx = 0;&lt;br /&gt;
    gbc.gridy = 0;&lt;br /&gt;
    gridbag.setConstraints(lblDepartmentList, gbc);&lt;br /&gt;
    gbc.anchor = GridBagConstraints.WEST;&lt;br /&gt;
    gbc.gridx = 1;&lt;br /&gt;
    gbc.gridy = 0;&lt;br /&gt;
    gridbag.setConstraints(cmbDepartmentList, gbc);&lt;br /&gt;
    gbc.anchor = GridBagConstraints.EAST;&lt;br /&gt;
    gbc.insets.left = 2;&lt;br /&gt;
    gbc.insets.right = 2;&lt;br /&gt;
    gbc.insets.top = 40;&lt;br /&gt;
    gbc.gridx = 0;&lt;br /&gt;
    gbc.gridy = 6;&lt;br /&gt;
    gridbag.setConstraints(btnOK, gbc);&lt;br /&gt;
    gbc.anchor = GridBagConstraints.WEST;&lt;br /&gt;
    gbc.gridx = 1;&lt;br /&gt;
    gbc.gridy = 6;&lt;br /&gt;
    gridbag.setConstraints(btnExit, gbc);&lt;br /&gt;
    Container contentPane = getContentPane();&lt;br /&gt;
    contentPane.add(buttonPanel, BorderLayout.CENTER);&lt;br /&gt;
    try {&lt;br /&gt;
      UIManager.setLookAndFeel(new WindowsLookAndFeel());&lt;br /&gt;
      SwingUtilities.updateComponentTreeUI(ReportManager.this);&lt;br /&gt;
    } catch (Exception ex) {&lt;br /&gt;
      System.out.println(ex);&lt;br /&gt;
    }&lt;br /&gt;
    initialize();&lt;br /&gt;
    setSize(250, 200);&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  private void initialize() throws Exception {&lt;br /&gt;
    // fill some test data here into the listbox.&lt;br /&gt;
    cmbDepartmentList.addItem(&amp;quot;HardWare&amp;quot;);&lt;br /&gt;
    cmbDepartmentList.addItem(&amp;quot;Electronics&amp;quot;);&lt;br /&gt;
    cmbDepartmentList.addItem(&amp;quot;Furniture&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public void register(Observer obs) {&lt;br /&gt;
    // Add to the list of Observers&lt;br /&gt;
    observersList.addElement(obs);&lt;br /&gt;
  }&lt;br /&gt;
  public void unRegister(Observer obs) {&lt;br /&gt;
    // remove from the list of Observers&lt;br /&gt;
  }&lt;br /&gt;
  public void notifyObservers() {&lt;br /&gt;
    // Send notify to all Observers&lt;br /&gt;
    for (int i = 0; i &amp;lt; observersList.size(); i++) {&lt;br /&gt;
      Observer observer = (Observer) observersList.elementAt(i);&lt;br /&gt;
      observer.refreshData(this);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public String getDepartment() {&lt;br /&gt;
    return department;&lt;br /&gt;
  }&lt;br /&gt;
  public void setDepartment(String dept) {&lt;br /&gt;
    department = dept;&lt;br /&gt;
  }&lt;br /&gt;
  class ButtonHandler implements ActionListener {&lt;br /&gt;
    ReportManager subject;&lt;br /&gt;
    public void actionPerformed(ActionEvent e) {&lt;br /&gt;
      if (e.getActionCommand().equals(ReportManager.EXIT)) {&lt;br /&gt;
        System.exit(1);&lt;br /&gt;
      }&lt;br /&gt;
      if (e.getActionCommand().equals(ReportManager.SET_OK)) {&lt;br /&gt;
        String dept = (String) cmbDepartmentList.getSelectedItem();&lt;br /&gt;
        //change in state&lt;br /&gt;
        subject.setDepartment(dept);&lt;br /&gt;
        subject.notifyObservers();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    public ButtonHandler() {&lt;br /&gt;
    }&lt;br /&gt;
    public ButtonHandler(ReportManager manager) {&lt;br /&gt;
      subject = manager;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}// end of class&lt;br /&gt;
interface Observer {&lt;br /&gt;
  public void refreshData(Observable subject);&lt;br /&gt;
}&lt;br /&gt;
interface Observable {&lt;br /&gt;
  public void notifyObservers();&lt;br /&gt;
  public void register(Observer obs);&lt;br /&gt;
  public void unRegister(Observer obs);&lt;br /&gt;
}&lt;br /&gt;
class FileUtil {&lt;br /&gt;
  DataOutputStream dos;&lt;br /&gt;
  /*&lt;br /&gt;
   * Utility method to write a given text to a file&lt;br /&gt;
   */&lt;br /&gt;
  public boolean writeToFile(String fileName, String dataLine,&lt;br /&gt;
      boolean isAppendMode, boolean isNewLine) {&lt;br /&gt;
    if (isNewLine) {&lt;br /&gt;
      dataLine = &amp;quot;\n&amp;quot; + dataLine;&lt;br /&gt;
    }&lt;br /&gt;
    try {&lt;br /&gt;
      File outFile = new File(fileName);&lt;br /&gt;
      if (isAppendMode) {&lt;br /&gt;
        dos = new DataOutputStream(new FileOutputStream(fileName, true));&lt;br /&gt;
      } else {&lt;br /&gt;
        dos = new DataOutputStream(new FileOutputStream(outFile));&lt;br /&gt;
      }&lt;br /&gt;
      dos.writeBytes(dataLine);&lt;br /&gt;
      dos.close();&lt;br /&gt;
    } catch (FileNotFoundException ex) {&lt;br /&gt;
      return (false);&lt;br /&gt;
    } catch (IOException ex) {&lt;br /&gt;
      return (false);&lt;br /&gt;
    }&lt;br /&gt;
    return (true);&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * Reads data from a given file&lt;br /&gt;
   */&lt;br /&gt;
  public String readFromFile(String fileName) {&lt;br /&gt;
    String DataLine = &amp;quot;&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
      File inFile = new File(fileName);&lt;br /&gt;
      BufferedReader br = new BufferedReader(new InputStreamReader(&lt;br /&gt;
          new FileInputStream(inFile)));&lt;br /&gt;
      DataLine = br.readLine();&lt;br /&gt;
      br.close();&lt;br /&gt;
    } catch (FileNotFoundException ex) {&lt;br /&gt;
      return (null);&lt;br /&gt;
    } catch (IOException ex) {&lt;br /&gt;
      return (null);&lt;br /&gt;
    }&lt;br /&gt;
    return (DataLine);&lt;br /&gt;
  }&lt;br /&gt;
  public boolean isFileExists(String fileName) {&lt;br /&gt;
    File file = new File(fileName);&lt;br /&gt;
    return file.exists();&lt;br /&gt;
  }&lt;br /&gt;
  public boolean deleteFile(String fileName) {&lt;br /&gt;
    File file = new File(fileName);&lt;br /&gt;
    return file.delete();&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * Reads data from a given file into a Vector&lt;br /&gt;
   */&lt;br /&gt;
  public Vector fileToVector(String fileName) {&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    String inputLine;&lt;br /&gt;
    try {&lt;br /&gt;
      File inFile = new File(fileName);&lt;br /&gt;
      BufferedReader br = new BufferedReader(new InputStreamReader(&lt;br /&gt;
          new FileInputStream(inFile)));&lt;br /&gt;
      while ((inputLine = br.readLine()) != null) {&lt;br /&gt;
        v.addElement(inputLine.trim());&lt;br /&gt;
      }&lt;br /&gt;
      br.close();&lt;br /&gt;
    } // Try&lt;br /&gt;
    catch (FileNotFoundException ex) {&lt;br /&gt;
      //&lt;br /&gt;
    } catch (IOException ex) {&lt;br /&gt;
      //&lt;br /&gt;
    }&lt;br /&gt;
    return (v);&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * Writes data from an input vector to a given file&lt;br /&gt;
   */&lt;br /&gt;
  public void vectorToFile(Vector v, String fileName) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; v.size(); i++) {&lt;br /&gt;
      writeToFile(fileName, (String) v.elementAt(i), true, true);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * Copies unique rows from a source file to a destination file&lt;br /&gt;
   */&lt;br /&gt;
  public void copyUniqueElements(String sourceFile, String resultFile) {&lt;br /&gt;
    Vector v = fileToVector(sourceFile);&lt;br /&gt;
    v = MiscUtil.removeDuplicates(v);&lt;br /&gt;
    vectorToFile(v, resultFile);&lt;br /&gt;
  }&lt;br /&gt;
} // end FileUtil&lt;br /&gt;
class MiscUtil {&lt;br /&gt;
  public static boolean hasDuplicates(Vector v) {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    boolean duplicates = false;&lt;br /&gt;
    for (i = 0; i &amp;lt; v.size() - 1; i++) {&lt;br /&gt;
      for (j = (i + 1); j &amp;lt; v.size(); j++) {&lt;br /&gt;
        if (v.elementAt(i).toString().equalsIgnoreCase(&lt;br /&gt;
            v.elementAt(j).toString())) {&lt;br /&gt;
          duplicates = true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return duplicates;&lt;br /&gt;
  }&lt;br /&gt;
  public static Vector removeDuplicates(Vector s) {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    boolean duplicates = false;&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    for (i = 0; i &amp;lt; s.size(); i++) {&lt;br /&gt;
      duplicates = false;&lt;br /&gt;
      for (j = (i + 1); j &amp;lt; s.size(); j++) {&lt;br /&gt;
        if (s.elementAt(i).toString().equalsIgnoreCase(&lt;br /&gt;
            s.elementAt(j).toString())) {&lt;br /&gt;
          duplicates = true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (duplicates == false) {&lt;br /&gt;
        v.addElement(s.elementAt(i).toString().trim());&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return v;&lt;br /&gt;
  }&lt;br /&gt;
  public static Vector removeDuplicateDomains(Vector s) {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    boolean duplicates = false;&lt;br /&gt;
    String str1 = &amp;quot;&amp;quot;;&lt;br /&gt;
    String str2 = &amp;quot;&amp;quot;;&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    for (i = 0; i &amp;lt; s.size(); i++) {&lt;br /&gt;
      duplicates = false;&lt;br /&gt;
      for (j = (i + 1); j &amp;lt; s.size(); j++) {&lt;br /&gt;
        str1 = &amp;quot;&amp;quot;;&lt;br /&gt;
        str2 = &amp;quot;&amp;quot;;&lt;br /&gt;
        str1 = s.elementAt(i).toString().trim();&lt;br /&gt;
        str2 = s.elementAt(j).toString().trim();&lt;br /&gt;
        if (str1.indexOf(&amp;quot;@&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
          str1 = str1.substring(str1.indexOf(&amp;quot;@&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        if (str2.indexOf(&amp;quot;@&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
          str2 = str2.substring(str2.indexOf(&amp;quot;@&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        if (str1.equalsIgnoreCase(str2)) {&lt;br /&gt;
          duplicates = true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (duplicates == false) {&lt;br /&gt;
        v.addElement(s.elementAt(i).toString().trim());&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return v;&lt;br /&gt;
  }&lt;br /&gt;
  public static boolean areVectorsEqual(Vector a, Vector b) {&lt;br /&gt;
    if (a.size() != b.size()) {&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int vectorSize = a.size();&lt;br /&gt;
    boolean identical = true;&lt;br /&gt;
    for (i = 0; i &amp;lt; vectorSize; i++) {&lt;br /&gt;
      if (!(a.elementAt(i).toString().equalsIgnoreCase(b.elementAt(i)&lt;br /&gt;
          .toString()))) {&lt;br /&gt;
        identical = false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return identical;&lt;br /&gt;
  }&lt;br /&gt;
  public static Vector removeDuplicates(Vector a, Vector b) {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    boolean present = true;&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    for (i = 0; i &amp;lt; a.size(); i++) {&lt;br /&gt;
      present = false;&lt;br /&gt;
      for (j = 0; j &amp;lt; b.size(); j++) {&lt;br /&gt;
        if (a.elementAt(i).toString().equalsIgnoreCase(&lt;br /&gt;
            b.elementAt(j).toString())) {&lt;br /&gt;
          present = true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (!(present)) {&lt;br /&gt;
        v.addElement(a.elementAt(i));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return v;&lt;br /&gt;
  }&lt;br /&gt;
}// end of class&lt;br /&gt;
&lt;br /&gt;
//File: Transactions.dat&lt;br /&gt;
/*&lt;br /&gt;
Furniture,1,1,2,200&lt;br /&gt;
Furniture,1,10,2,400&lt;br /&gt;
Furniture,1,15,2,400&lt;br /&gt;
Furniture,2,1,2,2000&lt;br /&gt;
Furniture,2,10,2,2000&lt;br /&gt;
Furniture,2,15,2,1000&lt;br /&gt;
Furniture,3,1,2,2000&lt;br /&gt;
Furniture,3,10,2,1000&lt;br /&gt;
Furniture,3,15,2,1000&lt;br /&gt;
Furniture,4,1,2,200&lt;br /&gt;
Furniture,4,10,2,400&lt;br /&gt;
Furniture,4,15,2,400&lt;br /&gt;
Furniture,5,1,2,2000&lt;br /&gt;
Furniture,5,1,2,2000&lt;br /&gt;
Furniture,5,1,2,2000&lt;br /&gt;
Furniture,6,10,2,2000&lt;br /&gt;
Furniture,6,15,2,2000&lt;br /&gt;
Furniture,6,1,2,1000&lt;br /&gt;
Furniture,7,10,2,200&lt;br /&gt;
Furniture,7,15,2,700&lt;br /&gt;
Furniture,7,1,2,100&lt;br /&gt;
Furniture,8,10,2,200&lt;br /&gt;
Furniture,8,15,2,200&lt;br /&gt;
Furniture,8,1,2,1600&lt;br /&gt;
Furniture,9,10,2,200&lt;br /&gt;
Furniture,9,15,2,200&lt;br /&gt;
Furniture,9,1,2,600&lt;br /&gt;
Furniture,10,10,2,1000&lt;br /&gt;
Furniture,10,15,2,2000&lt;br /&gt;
Furniture,10,1,2,1000&lt;br /&gt;
Furniture,11,10,2,200&lt;br /&gt;
Furniture,11,15,2,200&lt;br /&gt;
Furniture,11,1,2,800&lt;br /&gt;
Furniture,12,10,2,2000&lt;br /&gt;
Furniture,12,15,2,2000&lt;br /&gt;
Furniture,12,1,2,2000&lt;br /&gt;
HardWare,1,1,2,2000&lt;br /&gt;
HardWare,1,10,2,2000&lt;br /&gt;
HardWare,1,15,2,1000&lt;br /&gt;
HardWare,2,1,2,2000&lt;br /&gt;
HardWare,2,10,2,2000&lt;br /&gt;
HardWare,2,15,2,2000&lt;br /&gt;
HardWare,3,1,2,200&lt;br /&gt;
HardWare,3,10,2,1000&lt;br /&gt;
HardWare,3,15,2,800&lt;br /&gt;
HardWare,4,1,2,200&lt;br /&gt;
HardWare,4,10,2,400&lt;br /&gt;
HardWare,4,15,2,400&lt;br /&gt;
HardWare,5,1,2,200&lt;br /&gt;
HardWare,5,1,2,200&lt;br /&gt;
HardWare,5,1,2,600&lt;br /&gt;
HardWare,6,10,2,2000&lt;br /&gt;
HardWare,6,15,2,2000&lt;br /&gt;
HardWare,6,1,2,1000&lt;br /&gt;
HardWare,7,10,2,200&lt;br /&gt;
HardWare,7,15,2,700&lt;br /&gt;
HardWare,7,1,2,100&lt;br /&gt;
HardWare,8,10,2,200&lt;br /&gt;
HardWare,8,15,2,200&lt;br /&gt;
HardWare,8,1,2,600&lt;br /&gt;
HardWare,9,10,2,200&lt;br /&gt;
HardWare,9,15,2,200&lt;br /&gt;
HardWare,9,1,2,600&lt;br /&gt;
HardWare,10,10,2,2000&lt;br /&gt;
HardWare,10,15,2,2000&lt;br /&gt;
HardWare,10,1,2,2000&lt;br /&gt;
HardWare,11,10,2,1000&lt;br /&gt;
HardWare,11,15,2,200&lt;br /&gt;
HardWare,11,1,2,1800&lt;br /&gt;
HardWare,12,10,2,200&lt;br /&gt;
HardWare,12,15,2,200&lt;br /&gt;
HardWare,12,1,2,600&lt;br /&gt;
Electronics,1,1,2,200&lt;br /&gt;
Electronics,1,10,2,400&lt;br /&gt;
Electronics,1,15,2,400&lt;br /&gt;
Electronics,2,1,2,2000&lt;br /&gt;
Electronics,2,10,2,2000&lt;br /&gt;
Electronics,2,15,2,1000&lt;br /&gt;
Electronics,3,1,2,2000&lt;br /&gt;
Electronics,3,10,2,1000&lt;br /&gt;
Electronics,3,15,2,1000&lt;br /&gt;
Electronics,4,1,2,200&lt;br /&gt;
Electronics,4,10,2,400&lt;br /&gt;
Electronics,4,15,2,400&lt;br /&gt;
Electronics,5,1,2,200&lt;br /&gt;
Electronics,5,1,2,200&lt;br /&gt;
Electronics,5,1,2,600&lt;br /&gt;
Electronics,6,10,2,2000&lt;br /&gt;
Electronics,6,15,2,2000&lt;br /&gt;
Electronics,6,1,2,1000&lt;br /&gt;
Electronics,7,10,2,200&lt;br /&gt;
Electronics,7,15,2,700&lt;br /&gt;
Electronics,7,1,2,100&lt;br /&gt;
Electronics,8,10,2,1200&lt;br /&gt;
Electronics,8,15,2,1200&lt;br /&gt;
Electronics,8,1,2,1600&lt;br /&gt;
Electronics,9,10,2,200&lt;br /&gt;
Electronics,9,15,2,200&lt;br /&gt;
Electronics,9,1,2,600&lt;br /&gt;
Electronics,10,10,2,1000&lt;br /&gt;
Electronics,10,15,2,2000&lt;br /&gt;
Electronics,10,1,2,1000&lt;br /&gt;
Electronics,11,10,2,1000&lt;br /&gt;
Electronics,11,15,2,200&lt;br /&gt;
Electronics,11,1,2,1800&lt;br /&gt;
Electronics,12,10,2,200&lt;br /&gt;
Electronics,12,15,2,200&lt;br /&gt;
Electronics,12,1,2,600&lt;br /&gt;
*/&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observer Pattern in Java 2 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
//[C] 2002 Sun Microsystems, Inc.---&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.GridLayout;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import javax.swing.BoxLayout;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JComboBox;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JScrollPane;&lt;br /&gt;
import javax.swing.JTextArea;&lt;br /&gt;
import javax.swing.JTextField;&lt;br /&gt;
public class RunObserverPattern {&lt;br /&gt;
  public static void main(String[] arguments) {&lt;br /&gt;
    System.out.println(&amp;quot;Example for the Observer pattern&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;This demonstration uses a central observable&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; object to send change notifications to several&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; JPanels in a GUI. Each JPanel is an Observer,&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; receiving notifcations when there has been some&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; change in the shared Task that is being edited.&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out.println(&amp;quot;Creating the ObserverGui&amp;quot;);&lt;br /&gt;
    ObserverGui application = new ObserverGui();&lt;br /&gt;
    application.createGui();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Task {&lt;br /&gt;
  private String name = &amp;quot;&amp;quot;;&lt;br /&gt;
  private String notes = &amp;quot;&amp;quot;;&lt;br /&gt;
  private double timeRequired;&lt;br /&gt;
  public Task() {&lt;br /&gt;
  }&lt;br /&gt;
  public Task(String newName, String newNotes, double newTimeRequired) {&lt;br /&gt;
    name = newName;&lt;br /&gt;
    notes = newNotes;&lt;br /&gt;
    timeRequired = newTimeRequired;&lt;br /&gt;
  }&lt;br /&gt;
  public String getName() {&lt;br /&gt;
    return name;&lt;br /&gt;
  }&lt;br /&gt;
  public String getNotes() {&lt;br /&gt;
    return notes;&lt;br /&gt;
  }&lt;br /&gt;
  public double getTimeRequired() {&lt;br /&gt;
    return timeRequired;&lt;br /&gt;
  }&lt;br /&gt;
  public void setName(String newName) {&lt;br /&gt;
    name = newName;&lt;br /&gt;
  }&lt;br /&gt;
  public void setTimeRequired(double newTimeRequired) {&lt;br /&gt;
    timeRequired = newTimeRequired;&lt;br /&gt;
  }&lt;br /&gt;
  public void setNotes(String newNotes) {&lt;br /&gt;
    notes = newNotes;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return name + &amp;quot; &amp;quot; + notes;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class TaskChangeObservable {&lt;br /&gt;
  private ArrayList observers = new ArrayList();&lt;br /&gt;
  public void addTaskChangeObserver(TaskChangeObserver observer) {&lt;br /&gt;
    if (!observers.contains(observer)) {&lt;br /&gt;
      observers.add(observer);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void removeTaskChangeObserver(TaskChangeObserver observer) {&lt;br /&gt;
    observers.remove(observer);&lt;br /&gt;
  }&lt;br /&gt;
  public void selectTask(Task task) {&lt;br /&gt;
    Iterator elements = observers.iterator();&lt;br /&gt;
    while (elements.hasNext()) {&lt;br /&gt;
      ((TaskChangeObserver) elements.next()).taskSelected(task);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void addTask(Task task) {&lt;br /&gt;
    Iterator elements = observers.iterator();&lt;br /&gt;
    while (elements.hasNext()) {&lt;br /&gt;
      ((TaskChangeObserver) elements.next()).taskAdded(task);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void updateTask(Task task) {&lt;br /&gt;
    Iterator elements = observers.iterator();&lt;br /&gt;
    while (elements.hasNext()) {&lt;br /&gt;
      ((TaskChangeObserver) elements.next()).taskChanged(task);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface TaskChangeObserver {&lt;br /&gt;
  public void taskAdded(Task task);&lt;br /&gt;
  public void taskChanged(Task task);&lt;br /&gt;
  public void taskSelected(Task task);&lt;br /&gt;
}&lt;br /&gt;
class TaskEditorPanel extends JPanel implements ActionListener,&lt;br /&gt;
    TaskChangeObserver {&lt;br /&gt;
  private JPanel controlPanel, editPanel;&lt;br /&gt;
  private JButton add, update, exit;&lt;br /&gt;
  private JTextField taskName, taskNotes, taskTime;&lt;br /&gt;
  private TaskChangeObservable notifier;&lt;br /&gt;
  private Task editTask;&lt;br /&gt;
  public TaskEditorPanel(TaskChangeObservable newNotifier) {&lt;br /&gt;
    notifier = newNotifier;&lt;br /&gt;
    createGui();&lt;br /&gt;
  }&lt;br /&gt;
  public void createGui() {&lt;br /&gt;
    setLayout(new BorderLayout());&lt;br /&gt;
    editPanel = new JPanel();&lt;br /&gt;
    editPanel.setLayout(new GridLayout(3, 2));&lt;br /&gt;
    taskName = new JTextField(20);&lt;br /&gt;
    taskNotes = new JTextField(20);&lt;br /&gt;
    taskTime = new JTextField(20);&lt;br /&gt;
    editPanel.add(new JLabel(&amp;quot;Task Name&amp;quot;));&lt;br /&gt;
    editPanel.add(taskName);&lt;br /&gt;
    editPanel.add(new JLabel(&amp;quot;Task Notes&amp;quot;));&lt;br /&gt;
    editPanel.add(taskNotes);&lt;br /&gt;
    editPanel.add(new JLabel(&amp;quot;Time Required&amp;quot;));&lt;br /&gt;
    editPanel.add(taskTime);&lt;br /&gt;
    controlPanel = new JPanel();&lt;br /&gt;
    add = new JButton(&amp;quot;Add Task&amp;quot;);&lt;br /&gt;
    update = new JButton(&amp;quot;Update Task&amp;quot;);&lt;br /&gt;
    exit = new JButton(&amp;quot;Exit&amp;quot;);&lt;br /&gt;
    controlPanel.add(add);&lt;br /&gt;
    controlPanel.add(update);&lt;br /&gt;
    controlPanel.add(exit);&lt;br /&gt;
    add.addActionListener(this);&lt;br /&gt;
    update.addActionListener(this);&lt;br /&gt;
    exit.addActionListener(this);&lt;br /&gt;
    add(controlPanel, BorderLayout.SOUTH);&lt;br /&gt;
    add(editPanel, BorderLayout.CENTER);&lt;br /&gt;
  }&lt;br /&gt;
  public void setTaskChangeObservable(TaskChangeObservable newNotifier) {&lt;br /&gt;
    notifier = newNotifier;&lt;br /&gt;
  }&lt;br /&gt;
  public void actionPerformed(ActionEvent event) {&lt;br /&gt;
    Object source = event.getSource();&lt;br /&gt;
    if (source == add) {&lt;br /&gt;
      double timeRequired = 0.0;&lt;br /&gt;
      try {&lt;br /&gt;
        timeRequired = Double.parseDouble(taskTime.getText());&lt;br /&gt;
      } catch (NumberFormatException exc) {&lt;br /&gt;
      }&lt;br /&gt;
      notifier.addTask(new Task(taskName.getText(), taskNotes.getText(),&lt;br /&gt;
          timeRequired));&lt;br /&gt;
    } else if (source == update) {&lt;br /&gt;
      editTask.setName(taskName.getText());&lt;br /&gt;
      editTask.setNotes(taskNotes.getText());&lt;br /&gt;
      try {&lt;br /&gt;
        editTask&lt;br /&gt;
            .setTimeRequired(Double.parseDouble(taskTime.getText()));&lt;br /&gt;
      } catch (NumberFormatException exc) {&lt;br /&gt;
      }&lt;br /&gt;
      notifier.updateTask(editTask);&lt;br /&gt;
    } else if (source == exit) {&lt;br /&gt;
      System.exit(0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void taskAdded(Task task) {&lt;br /&gt;
  }&lt;br /&gt;
  public void taskChanged(Task task) {&lt;br /&gt;
  }&lt;br /&gt;
  public void taskSelected(Task task) {&lt;br /&gt;
    editTask = task;&lt;br /&gt;
    taskName.setText(task.getName());&lt;br /&gt;
    taskNotes.setText(task.getNotes());&lt;br /&gt;
    taskTime.setText(&amp;quot;&amp;quot; + task.getTimeRequired());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class TaskHistoryPanel extends JPanel implements TaskChangeObserver {&lt;br /&gt;
  private JTextArea displayRegion;&lt;br /&gt;
  public TaskHistoryPanel() {&lt;br /&gt;
    createGui();&lt;br /&gt;
  }&lt;br /&gt;
  public void createGui() {&lt;br /&gt;
    setLayout(new BorderLayout());&lt;br /&gt;
    displayRegion = new JTextArea(10, 40);&lt;br /&gt;
    displayRegion.setEditable(false);&lt;br /&gt;
    add(new JScrollPane(displayRegion));&lt;br /&gt;
  }&lt;br /&gt;
  public void taskAdded(Task task) {&lt;br /&gt;
    displayRegion.append(&amp;quot;Created task &amp;quot; + task + &amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public void taskChanged(Task task) {&lt;br /&gt;
    displayRegion.append(&amp;quot;Updated task &amp;quot; + task + &amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public void taskSelected(Task task) {&lt;br /&gt;
    displayRegion.append(&amp;quot;Selected task &amp;quot; + task + &amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class TaskSelectorPanel extends JPanel implements ActionListener,&lt;br /&gt;
    TaskChangeObserver {&lt;br /&gt;
  private JComboBox selector = new JComboBox();&lt;br /&gt;
  private TaskChangeObservable notifier;&lt;br /&gt;
  public TaskSelectorPanel(TaskChangeObservable newNotifier) {&lt;br /&gt;
    notifier = newNotifier;&lt;br /&gt;
    createGui();&lt;br /&gt;
  }&lt;br /&gt;
  public void createGui() {&lt;br /&gt;
    selector = new JComboBox();&lt;br /&gt;
    selector.addActionListener(this);&lt;br /&gt;
    add(selector);&lt;br /&gt;
  }&lt;br /&gt;
  public void actionPerformed(ActionEvent evt) {&lt;br /&gt;
    notifier.selectTask((Task) selector.getSelectedItem());&lt;br /&gt;
  }&lt;br /&gt;
  public void setTaskChangeObservable(TaskChangeObservable newNotifier) {&lt;br /&gt;
    notifier = newNotifier;&lt;br /&gt;
  }&lt;br /&gt;
  public void taskAdded(Task task) {&lt;br /&gt;
    selector.addItem(task);&lt;br /&gt;
  }&lt;br /&gt;
  public void taskChanged(Task task) {&lt;br /&gt;
  }&lt;br /&gt;
  public void taskSelected(Task task) {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class ObserverGui {&lt;br /&gt;
  public void createGui() {&lt;br /&gt;
    JFrame mainFrame = new JFrame(&amp;quot;Observer Pattern Example&amp;quot;);&lt;br /&gt;
    Container content = mainFrame.getContentPane();&lt;br /&gt;
    content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));&lt;br /&gt;
    TaskChangeObservable observable = new TaskChangeObservable();&lt;br /&gt;
    TaskSelectorPanel select = new TaskSelectorPanel(observable);&lt;br /&gt;
    TaskHistoryPanel history = new TaskHistoryPanel();&lt;br /&gt;
    TaskEditorPanel edit = new TaskEditorPanel(observable);&lt;br /&gt;
    observable.addTaskChangeObserver(select);&lt;br /&gt;
    observable.addTaskChangeObserver(history);&lt;br /&gt;
    observable.addTaskChangeObserver(edit);&lt;br /&gt;
    observable.addTask(new Task());&lt;br /&gt;
    content.add(select);&lt;br /&gt;
    content.add(history);&lt;br /&gt;
    content.add(edit);&lt;br /&gt;
    mainFrame.addWindowListener(new WindowCloseManager());&lt;br /&gt;
    mainFrame.pack();&lt;br /&gt;
    mainFrame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  private class WindowCloseManager extends WindowAdapter {&lt;br /&gt;
    public void windowClosing(WindowEvent evt) {&lt;br /&gt;
      System.exit(0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Using Observer pattern with two observers observing a changing integer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
import java.util.Observable;&lt;br /&gt;
import java.util.Observer;&lt;br /&gt;
public class Main {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    MyObservable observable = new MyObservable();&lt;br /&gt;
    MyObserver1 observer1 = new MyObserver1();&lt;br /&gt;
    MyObserver2 observer2 = new MyObserver2();&lt;br /&gt;
    observable.addObserver(observer1);&lt;br /&gt;
    observable.addObserver(observer2);&lt;br /&gt;
    observable.start();&lt;br /&gt;
    try {&lt;br /&gt;
      Thread.sleep(20000);&lt;br /&gt;
    } catch (InterruptedException e) {&lt;br /&gt;
      e.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class MyObserver1 implements Observer {&lt;br /&gt;
  public void update(Observable o, Object arg) {&lt;br /&gt;
    Integer count = (Integer) arg;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class MyObserver2 implements Observer {&lt;br /&gt;
  public void update(Observable o, Object arg) {&lt;br /&gt;
    Integer count = (Integer) arg;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class MyObservable extends Observable implements Runnable {&lt;br /&gt;
  public MyObservable() {&lt;br /&gt;
  }&lt;br /&gt;
  public void start() {&lt;br /&gt;
    new Thread(this).start();&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    int count = 0;&lt;br /&gt;
    try {&lt;br /&gt;
      Thread.sleep(3000);&lt;br /&gt;
    } catch (InterruptedException e) {&lt;br /&gt;
      e.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
    count++;&lt;br /&gt;
    setChanged();&lt;br /&gt;
    notifyObservers(new Integer(count));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>