Composite pattern in Java
/* The Design Patterns Java Companion Copyright (C) 1998, by James W. Cooper IBM Thomas J. Watson Research Center */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Enumeration; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.border.BevelBorder; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; public class EmpTree extends JFrame implements TreeSelectionListener { Employee boss, marketVP, prodVP; Employee salesMgr, advMgr; Employee prodMgr, shipMgr; JScrollPane sp; JPanel treePanel; JTree tree; DefaultMutableTreeNode troot; JLabel cost; public EmpTree() { super("Employee tree"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); makeEmployees(); setGUI(); } //-------------------------------------- private void setGUI() { treePanel = new JPanel(); getContentPane().add(treePanel); treePanel.setLayout(new BorderLayout()); sp = new JScrollPane(); treePanel.add("Center", sp); treePanel.add("South", cost = new JLabel(" ")); treePanel.setBorder(new BevelBorder(BevelBorder.RAISED)); troot = new DefaultMutableTreeNode(boss.getName()); tree = new JTree(troot); tree.setBackground(Color.lightGray); loadTree(boss); /* Put the Tree in a scroller. */ sp.getViewport().add(tree); setSize(new Dimension(200, 300)); setVisible(true); } //------------------------------------ public void loadTree(Employee topDog) { DefaultMutableTreeNode troot; troot = new DefaultMutableTreeNode(topDog.getName()); treePanel.remove(tree); tree = new JTree(troot); tree.addTreeSelectionListener(this); sp.getViewport().add(tree); addNodes(troot, topDog); tree.expandRow(0); repaint(); } //-------------------------------------- private void addNodes(DefaultMutableTreeNode pnode, Employee emp) { DefaultMutableTreeNode node; Enumeration e = emp.elements(); while (e.hasMoreElements()) { Employee newEmp = (Employee) e.nextElement(); node = new DefaultMutableTreeNode(newEmp.getName()); pnode.add(node); addNodes(node, newEmp); } } //-------------------------------------- private void makeEmployees() { boss = new Employee("CEO", 200000); boss.add(marketVP = new Employee("Marketing VP", 100000)); boss.add(prodVP = new Employee("Production VP", 100000)); marketVP.add(salesMgr = new Employee("Sales Mgr", 50000)); marketVP.add(advMgr = new Employee("Advt Mgr", 50000)); for (int i = 0; i < 5; i++) salesMgr.add(new Employee("Sales " + new Integer(i).toString(), 30000.0F + (float) (Math.random() - 0.5) * 10000)); advMgr.add(new Employee("Secy", 20000)); prodVP.add(prodMgr = new Employee("Prod Mgr", 40000)); prodVP.add(shipMgr = new Employee("Ship Mgr", 35000)); for (int i = 0; i < 4; i++) prodMgr.add(new Employee("Manuf " + new Integer(i).toString(), 25000.0F + (float) (Math.random() - 0.5) * 5000)); for (int i = 0; i < 3; i++) shipMgr.add(new Employee("ShipClrk " + new Integer(i).toString(), 20000.0F + (float) (Math.random() - 0.5) * 5000)); } //-------------------------------------- public void valueChanged(TreeSelectionEvent evt) { TreePath path = evt.getPath(); String selectedTerm = path.getLastPathComponent().toString(); Employee emp = boss.getChild(selectedTerm); if (emp != null) cost.setText(new Float(emp.getSalaries()).toString()); } //-------------------------------------- static public void main(String argv[]) { new EmpTree(); } } class Employee { String name; float salary; Vector subordinates; boolean isLeaf; Employee parent = null; //-------------------------------------- public Employee(String _name, float _salary) { name = _name; salary = _salary; subordinates = new Vector(); isLeaf = false; } //-------------------------------------- public Employee(Employee _parent, String _name, float _salary) { name = _name; salary = _salary; parent = _parent; subordinates = new Vector(); isLeaf = false; } //-------------------------------------- public void setLeaf(boolean b) { isLeaf = b; //if true, do not allow children } //-------------------------------------- public float getSalary() { return salary; } //-------------------------------------- public String getName() { return name; } //-------------------------------------- public boolean add(Employee e) { if (!isLeaf) subordinates.addElement(e); return isLeaf; //false if unsuccessful } //-------------------------------------- public void remove(Employee e) { if (!isLeaf) subordinates.removeElement(e); } //-------------------------------------- public Enumeration elements() { return subordinates.elements(); } //-------------------------------------- public Employee getChild(String s) { Employee newEmp = null; if (getName().equals(s)) return this; else { boolean found = false; Enumeration e = elements(); while (e.hasMoreElements() && (!found)) { newEmp = (Employee) e.nextElement(); found = newEmp.getName().equals(s); if (!found) { newEmp = newEmp.getChild(s); found = (newEmp != null); } } if (found) return newEmp; else return null; } } //-------------------------------------- public float getSalaries() { float sum = salary; for (int i = 0; i < subordinates.size(); i++) { sum += ((Employee) subordinates.elementAt(i)).getSalaries(); } return sum; } }
1. | Composite Pattern 2 | ||
2. | Composite Patterns in Java 2 |