1. // 公司类
    2. public abstract class Company {
    3. protected String name;
    4. public Company(String name) {
    5. this.name = name;
    6. }
    7. public abstract void Add(Company c);
    8. public abstract void Remove(Company c);
    9. public abstract void Display(int depth);
    10. public abstract void LineOfDuty(); // 履行职责
    11. }
    12. // 为组合中对象声明接口
    13. public abstract class Component {
    14. protected String name;
    15. public Component(String name){
    16. this.name=name;
    17. }
    18. // 通常用Add和Rmove方法来提供增加或移除树叶或树枝功能
    19. public abstract void Add(Component c);
    20. public abstract void Remove(Component c);
    21. public abstract void Display(int depth);
    22. }
    23. // 具体公司类,实现接口,树枝节点
    24. public class ConcreteCompany extends Company{
    25. private ArrayList<Company> childern=new ArrayList<Company>();
    26. public ConcreteCompany(String name) {
    27. super(name);
    28. }
    29. @Override
    30. public void Add(Company c) {
    31. childern.add(c);
    32. }
    33. @Override
    34. public void Remove(Company c) {
    35. childern.remove(c);
    36. }
    37. @Override
    38. public void Display(int depth) {
    39. String string="";
    40. for (int i = 0; i <depth; i++) {
    41. string+="-";
    42. }
    43. System.out.println(string+this.name);
    44. // 遍历下级节点
    45. for (Company company : childern) {
    46. company.Display(depth+2);
    47. }
    48. }
    49. // 履行职责
    50. @Override
    51. public void LineOfDuty() {
    52. for (Company company : childern) {
    53. company.LineOfDuty();
    54. }
    55. }
    56. }
    57. // 财务部门
    58. public class FinanceDepartment extends Company {
    59. public FinanceDepartment(String name) {
    60. super(name);
    61. // TODO Auto-generated constructor stub
    62. }
    63. @Override
    64. public void Add(Company c) {
    65. // TODO Auto-generated method stub
    66. }
    67. @Override
    68. public void Remove(Company c) {
    69. // TODO Auto-generated method stub
    70. }
    71. @Override
    72. public void Display(int depth) {
    73. String string="";
    74. for (int i = 0; i <depth; i++) {
    75. string+="-";
    76. }
    77. System.out.println(string+name);
    78. }
    79. @Override
    80. public void LineOfDuty() {
    81. System.out.println(this.name+"公司财务收支管理");
    82. }
    83. }
    84. // 人力部门
    85. public class HRDepartment extends Company {
    86. public HRDepartment(String name) {
    87. super(name);
    88. // TODO Auto-generated constructor stub
    89. }
    90. @Override
    91. public void Add(Company c) {
    92. // TODO Auto-generated method stub
    93. }
    94. @Override
    95. public void Remove(Company c) {
    96. // TODO Auto-generated method stub
    97. }
    98. @Override
    99. public void Display(int depth) {
    100. String string="";
    101. for (int i = 0; i <depth; i++) {
    102. string+="-";
    103. }
    104. System.out.println(string+name);
    105. }
    106. @Override
    107. public void LineOfDuty() {
    108. System.out.println(this.name+"员工招聘培训管理");
    109. }
    110. }
    111. public class Test {
    112. public static void main(String[] args) {
    113. ConcreteCompany root = new ConcreteCompany("北京总公司");
    114. root.Add(new HRDepartment("总公司人力资源部"));
    115. root.Add(new FinanceDepartment("总公司财务部"));
    116. ConcreteCompany comp = new ConcreteCompany("上海华东分公司");
    117. comp.Add(new HRDepartment("上海华东分公司人力资源部"));
    118. comp.Add(new FinanceDepartment("上海华东分公司财务部"));
    119. root.Add(comp);
    120. ConcreteCompany comp1 = new ConcreteCompany("南京办事处");
    121. comp1.Add(new HRDepartment("南京办事处人力资源部"));
    122. comp1.Add(new FinanceDepartment("南京办事处财务部"));
    123. comp.Add(comp1);
    124. ConcreteCompany comp2 = new ConcreteCompany("杭州办事处");
    125. comp2.Add(new HRDepartment("杭州办事处人力资源部"));
    126. comp2.Add(new FinanceDepartment("杭州办事处财务部"));
    127. comp.Add(comp2);
    128. root.Display(1);
    129. root.LineOfDuty();
    130. }
    131. }