王大虎

王大虎: 图21-4 修改后的类图

王大虎

类图上增加了一个ICorp接口,它是公司所有人员信息的接口类,不管你是经理还是员工,你都有名字、职位、薪水,这个定义成一个接口没有错,但是你可能对于ILeaf接口持怀疑状态,空接口有何意义呀?有意义!它是每个树枝节点的代表,系统扩容的时候你就会发现它是多么“栋梁”。我们先来看新增加的接口ICorp,如代码清单21-8所示。

代码清单21-8 公司人员接口

 

* * *

 

public interface ICorp { //每个员工都有信息,你想隐藏,门儿都没有! public String getInfo(); }

 

* * *

 

接口很简单,只有一个方法,就是获得员工的信息,树叶节点是最基层的构件,我们先来看看它的接口,空接口,如代码清单21-9所示。

代码清单21-9 树叶接口

 

* * *

 

public interface ILeaf extends ICorp { }

王大虎
王大虎

 

树叶接口的实现类,如代码清单21-10所示。

代码清单21-10 树叶接口

 

* * *

 

public class Leaf implements ILeaf { //小兵也有名称 private String name = “”; //小兵也有职位 private String position = “”; //小兵也有薪水,否则谁给你干 private int salary = 0; //通过一个构造函数传递小兵的信息 public Leaf(String name,String position,int salary){ this.name = name; this.position = position; this.salary = salary; } //获得小兵的信息 public String getInfo() { String info = “”; info = “姓名:” + this.name; info = info + “\t职位:”+ this.position; info = info + “\t薪水:” + this.salary; return info; } }

 

* * *

 

小兵就只有这些信息了,我们是具体干活的,我们是管理不了其他同事的,我们来看看那些经理和小组长是怎么实现的,也就是IBranch接口,如代码清单21-11所示。

代码清单21-11 树枝接口

 

* * *

 

public interface IBranch extends ICorp { //能够增加小兵(树叶节点)或者是经理(树枝节点) public void addSubordinate(ICorp corp); //我还要能够获得下属的信息 public ArrayList<ICorp> getSubordinate(); /*本来还应该有一个方法delSubordinate(ICorp corp),删除下属 * 这个方法我们没有用到就不写进来了 */ }

 

* * *

 

接口也很简单,其实现类也不可能太复杂,如代码清单21-12所示。

代码清单21-12 树枝实现类

 

王大虎

 

public class Branch implements IBranch { //领导也是人,也有名字 private String name = “”; //领导和领导不同,也是职位区别 private String position = “”; //领导也是拿薪水的 private int salary = 0; //领导下边有那些下级领导和小兵 ArrayList<ICorp> subordinateList = new ArrayList<ICorp>(); //通过构造函数传递领导的信息 public Branch(String name,String position,int salary){ this.name = name; this.position = position; this.salary = salary; } //增加一个下属,可能是小头目,也可能是个小兵 public void addSubordinate(ICorp corp) { this.subordinateList.add(corp); } //我有哪些下属 public ArrayList<ICorp> getSubordinate() { return this.subordinateList; } //领导也是人,他也有信息 public String getInfo() { String info = “”; info = “姓名:” + this.name; info = info + “\t职位:”+ this.position; info = info + “\t薪水:” + this.salary; return info; } }

 

* * *

 

实现类也很简单,不多说,程序写得好不好,就看别人怎么调用了,我们看场景类Client,如代码清单21-13所示。

代码清单21-13 场景类

 

* * *

 

public class Client { public static void main(String[] args) { //首先是组装一个组织结构出来 Branch ceo = compositeCorpTree(); //首先把CEO的信息打印出来: System.out.println(ceo.getInfo()); //然后是所有员工信息 System.out.println(getTreeInfo(ceo)); } //把整个树组装出来 public static Branch compositeCorpTree(){ //首先产生总经理CEO Branch root = new Branch(“王X子”,”总经理”,100000); //把三个部门经理产生出来 Branch developDep = new Branch(“刘大瘸子”,”研发部门经理”,10000); Branch salesDep = new Branch(“马二拐子”,”X部门经理”,20000); Branch financeDep = new Branch(“赵三驼子”,”财务部经理”,30000); //再把三个小组长产生出来 Branch firstDevGroup = new Branch(“杨三乜斜”,”开发一组组长”,5000); Branch secondDevGroup = new Branch(“吴大棒槌”,”开发二组组长”,6000); //把所有的小兵都产生出来 Leaf a = new Leaf(“a”,”开发人员”,2000); Leaf b = new Leaf(“b”,”开发人员”,2000); Leaf c = new Leaf(“c”,”开发人员”,2000); Leaf d = new Leaf(“d”,”开发人员”,2000); Leaf e = new Leaf(“e”,”开发人员”,2000); Leaf f = new Leaf(“f”,”开发人员”,2000); Leaf g = new Leaf(“g”,”开发人员”,2000); Leaf h = new Leaf(“h”,”X人员”,5000); Leaf i = new Leaf(“i”,”X人员”,4000); Leaf j = new Leaf(“j”,”财务人员”,5000); Leaf k = new Leaf(“k”,”CEO秘书”,8000); Leaf zhengLaoLiu = new Leaf(“郑老六”,”研发部副经理”,20000); //开始组装 //CEO下有三个部门经理和一个秘书 root.addSubordinate(k); root.addSubordinate(developDep); root.addSubordinate(salesDep); root.addSubordinate(financeDep); //研发部经理 developDep.addSubordinate(zhengLaoLiu); developDep.addSubordinate(firstDevGroup); developDep.addSubordinate(secondDevGroup); //看看两个开发小组下有什么 firstDevGroup.addSubordinate(a); firstDevGroup.addSubordinate(b); firstDevGroup.addSubordinate(c); secondDevGroup.addSubordinate(d); secondDevGroup.addSubordinate(e); secondDevGroup.addSubordinate(f); //再看X部下的人员情况 salesDep.addSubordinate(h); salesDep.addSubordinate(i); //最后一个财务 financeDep.addSubordinate(j); return root; } //遍历整棵树,只要给我根节点,我就能遍历出所有的节点 public static String getTreeInfo(Branch root){ ArrayList<ICorp> subordinateList = root.getSubordinate(); String info = “”; for(ICorp s :subordinateList){ if(s instanceof Leaf){ //是员工就直接获得信息 info = info + s.getInfo()+”\n”; }else{ //是个小头目 info = info + s.getInfo() +”\n”+ getTreeInfo((Branch)s); } } return info; } }

 

王大虎

 

运行结果完全相同,不再赘述。通过这样构件,一个非常清晰的树状人员资源管理图出现了,那我们的程序是否还可以优化?可以!你看Leaf和Branch中都有getInfo信息,是不是可以抽象?好,我们抽象一下,如图21-5所示。

 

图21-5 精简的类图

你一看这个图,乐了。能不乐嘛,减少很多工作量了,接口没有了,改成抽象类了,IBranch接口也没有了,直接把方法放到了实现类中了,太精简了!而且场景类只认定抽象类Corp就成,那我们首先来看抽象类ICorp,如代码清单21-14所示。

代码清单21-14 抽象公司职员类

发表评论

电子邮件地址不会被公开。 必填项已用*标注