现在的位置: 首页 > 综合 > 正文

设计模式-结构型模式-组合

2017年12月08日 ⁄ 综合 ⁄ 共 6754字 ⁄ 字号 评论关闭

结构型模式:结构型对象模式不是对接口或实现进行组合的.而是描述了如何对一些对象进行组合,从而实现新功能的一些方法.

compiste:将对象组合成树形结构以表示,"部份-整体"的层次结构.使用的单个对象和组合对象使用具有一致性.

 

package structure.compiste;

/**
 * A Component with some common function implementation
 * You can abstract it.
 */
import java.util.*;

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

}

 

package structure.compiste;

import java.awt.*;
import java.awt.event.*;
import java.util.*;

// swing classes
import javax.swing.text.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.tree.*;

public class empTree extends JxFrame 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");
        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();
    }
}

 

package structure.compiste;

import java.awt.*;
import java.awt.event.*;
import java.util.*;

// swing classes
import javax.swing.text.*;
import javax.swing.*;
import javax.swing.event.*;

public class JxFrame extends JFrame {

    public JxFrame(String title) {
        super(title);
        setCloseClick();
        setLF();
    }

    private void setCloseClick() {
        //create window listener to respond to window close click
        addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    //------------------------------------------
    private void setLF() {
        // Force SwingApp to come up in the System L&F
        String laf = UIManager.getSystemLookAndFeelClassName();
        try {
            UIManager.setLookAndFeel(laf);
        }
        catch (UnsupportedLookAndFeelException exc) {
            System.err.println("Warning: UnsupportedLookAndFeel: " + laf);
        }
        catch (Exception exc) {
            System.err.println("Error loading " + laf + ": " + exc);
        }
    }
}

 

 

抱歉!评论已关闭.