1700467877
名称:c 职位:开发人员 薪水:2000
1700467878
1700467879
名称:吴大棒槌 职位:开发二组组长 薪水:6000
1700467880
1700467881
名称:d 职位:开发人员 薪水:2000
1700467882
1700467883
名称:e 职位:开发人员 薪水:2000
1700467884
1700467885
名称:f 职位:开发人员 薪水:2000
1700467886
1700467887
名称:郑老六 职位:研发部副总 薪水:20000
1700467888
1700467889
名称:马二拐子 职位:销售部门经理 薪水:20000
1700467890
1700467891
名称:h 职位:销售人员 薪水:5000
1700467892
1700467893
名称:i 职位:销售人员 薪水:4000
1700467894
1700467895
名称:赵三驼子 职位:财务部经理 薪水:30000
1700467896
1700467897
名称:j 职位:财务人员 薪水:5000
1700467898
1700467899
名称:k 职位:CEO秘书 薪水:8000
1700467900
1700467901
和我们期望的结果一样,一棵完整的树就生成了,而且我们还能够遍历。不错,不错,但是看类图或程序的时候,你有没有发觉有问题?getInfo每个接口都有,为什么不能抽象出来?Root类和Branch类有什么差别?根节点本身就是树枝节点的一种,为什么要定义成两个接口两个类?如果我要加一个任职期限,你是不是每个类都需要修改?如果我要后序遍历(从员工找到他的上级领导)能做到吗?——彻底晕菜了!
1700467902
1700467903
问题很多,我们一个一个解决,先说抽象的问题。我们确实可以把IBranch和IRoot合并成一个接口,确认无疑的事我们先做,那我们就修改一下类图,如图21-3所示。
1700467904
1700467905
1700467906
1700467907
1700467908
图21-3 整合根节点和树枝节点后的类图
1700467909
1700467910
仔细看看这个类图,还能不能发现点问题。想想看接口的作用是什么?定义一类事物所具有的共性,那ILeaf和IBranch是不是也有共性呢?有,getInfo方法!我们是不是要把这个共性也封装起来呢?是的,是的,提炼事物的共同点,然后封装之,这是我们作为设计专家的拿手好戏,修改后的类图如图21-4所示。
1700467911
1700467912
1700467913
1700467914
1700467915
图21-4 修改后的类图
1700467916
1700467917
类图上增加了一个ICorp接口,它是公司所有人员信息的接口类,不管你是经理还是员工,你都有名字、职位、薪水,这个定义成一个接口没有错,但是你可能对于ILeaf接口持怀疑状态,空接口有何意义呀?有意义!它是每个树枝节点的代表,系统扩容的时候你就会发现它是多么“栋梁”。我们先来看新增加的接口ICorp,如代码清单21-8所示。
1700467918
1700467919
代码清单21-8 公司人员接口
1700467920
1700467921
public interface ICorp{
1700467922
1700467923
//每个员工都有信息,你想隐藏,门儿都没有!
1700467924
1700467925
public String getInfo();
1700467926
[
上一页 ]
[ :1.700467877e+09 ]
[
下一页 ]