技术开发 频道

组合模式:实战人事管理之树状结构

  这个类图是初学者最容易想到的类图(首先声明,这个类图是有缺陷的,如果你已经看明白这个类图的缺陷了,该段落就可以一目十行地看下去,我们是循序渐进地讲课,一步一个脚印),非常简单,我们来看一下如何实现,先看较高级别的根节点接口,如代码清单21-1所示。

  代码清单21-1 根节点接口

public interface IRoot {
    
//得到总经理的信息
    public String getInfo();
    
//总经理下边要有小兵,那要能增加小兵,比如研发部总经理,这是个树枝节点
    public void add(IBranch branch);
    
//那要能增加树叶节点
    public void add(ILeaf leaf);
    
//既然能增加,那要还要能够遍历,不可能总经理不知道他手下有哪些人
    public ArrayList getSubordinateInfo();    
}

  这个根节点的对象就是我们的总经理CEO,其具体实现如代码清单21-2所示。

  代码清单21-2 根节点的实现

public class Root implements IRoot {
    
//保存根节点下的树枝节点和树叶节点,Subordinate的意思是下级
    private ArrayList subordinateList = new ArrayList();
    
//根节点的名称
    private String name = "";
    
//根节点的职位
    private String position = "";
    
//根节点的薪水
    private int salary = 0;
    
//通过构造函数传递进来总经理的信息
    public Root(String name,String position,int salary){
        
this.name = name;
        
this.position = position;
        
this.salary = salary;
    }
    
//增加树枝节点
    public void add(IBranch branch) {
        
this.subordinateList.add(branch);
    }
    
//增加叶子节点,比如秘书,直接隶属于总经理
    public void add(ILeaf leaf) {
        
this.subordinateList.add(leaf);
    }
    
//得到自己的信息
    public String getInfo() {
        String info
= "";
        info
= "名称:"+ this.name;;
        info
= info + "\t职位:" + this.position;
        info
= info + "\t薪水: " + this.salary;
        
return info;
    }
    
//得到下级的信息
    public ArrayList getSubordinateInfo() {
        
return this.subordinateList;
    }
}

  很简单,通过构造函数传入参数,然后获得信息,可以增加子树枝节点(部门经理)和叶子节点(秘书)。我们再来看其他有分支的节点接口,如代码清单21-3所示。

  代码清单21-3 其他有分支的节点接口

public interface IBranch {
    
//获得信息
    public String getInfo();
    
//增加数据节点,例如研发部下的研发一组
    public void add(IBranch branch);
    
//增加叶子节点
    public void add(ILeaf leaf);
    
//获得下级信息
    public ArrayList getSubordinateInfo();
}
0
相关文章