01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package horstmann.ch05_invoice;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
   An invoice for a sale, consisting of line items.
 */
public class Invoice
{
  /**
      Constructs a blank invoice.
   */
  public Invoice()
  {
    items = new ArrayList<LineItem>();
    listeners = new ArrayList<ChangeListener>();
  }

  /**
      Adds an item to the invoice.
      @param item the item to add
   */
  public void addItem(LineItem item)
  {
    items.add(item);
    // Notify all observers of the change to the invoice
    ChangeEvent event = new ChangeEvent(this);
    for (ChangeListener listener : listeners)
      listener.stateChanged(event);
  }

  /**
      Adds a change listener to the invoice.
      @param listener the change listener to add
   */
  public void addChangeListener(ChangeListener listener)
  {
    listeners.add(listener);
  }

  /**
      Gets an iterator that iterates through the items.
      @return an iterator for the items
   */
  public Iterator<LineItem> getItems()
  {
    return new
        Iterator<LineItem>()
    {
      public boolean hasNext()
      {
        return current < items.size();
      }

      public LineItem next()
      {
        return items.get(current++);
      }

      public void remove()
      {
        throw new UnsupportedOperationException();
      }

      private int current = 0;
    };
  }

  public String format(InvoiceFormatter formatter)
  {
    String r = formatter.formatHeader();
    Iterator<LineItem>iter = getItems();
    while (iter.hasNext())
      r += formatter.formatLineItem(iter.next());
    return r + formatter.formatFooter();
  }

  private ArrayList<LineItem> items;
  private ArrayList<ChangeListener> listeners;
}