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;
}
 |