01: import java.util.*; 02: import javax.swing.event.*; 03: 04: /** 05: An invoice for a sale, consisting of line items. 06: */ 07: public class Invoice 08: { 09: /** 10: Constructs a blank invoice. 11: */ 12: public Invoice() 13: { 14: items = new ArrayList(); 15: listeners = new ArrayList(); 16: } 17: 18: /** 19: Adds an item to the invoice. 20: @param item the item to add 21: */ 22: public void addItem(LineItem item) 23: { 24: items.add(item); 25: // notify all observers of the change to the invoice 26: ChangeEvent event = new ChangeEvent(this); 27: for (int i = 0; i < listeners.size(); i++) 28: { 29: ChangeListener listener 30: = (ChangeListener) listeners.get(i); 31: listener.stateChanged(event); 32: } 33: } 34: 35: /** 36: Adds a change listener to the invoice. 37: @param listener the change listener to add 38: */ 39: public void addChangeListener(ChangeListener listener) 40: { 41: listeners.add(listener); 42: } 43: 44: /** 45: Gets an iterator that iterates through the items. 46: @return an iterator for the items 47: */ 48: public Iterator getItems() 49: { 50: return new 51: Iterator() 52: { 53: public boolean hasNext() 54: { 55: return current < items.size(); 56: } 57: public Object next() 58: { 59: Object r = items.get(current); 60: current++; 61: return r; 62: } 63: public void remove() 64: { 65: throw new UnsupportedOperationException(); 66: } 67: private int current = 0; 68: }; 69: } 70: 71: public String format(InvoiceFormatter formatter) 72: { 73: String r = formatter.formatHeader(); 74: Iterator iter = getItems(); 75: while (iter.hasNext()) 76: { 77: LineItem item = (LineItem) iter.next(); 78: r += formatter.formatLineItem(item); 79: } 80: return r + formatter.formatFooter(); 81: } 82: 83: private ArrayList items; 84: private ArrayList listeners; 85: }