一、需求

image.png

二、基本介绍

image.png
image.png

三、代码

image.png

组织组件

  1. @Data
  2. public abstract class OrganizationComponent {
  3. private String name; // 名字
  4. private String des; // 说明
  5. protected void add(OrganizationComponent organizationComponent) {
  6. //默认实现
  7. throw new UnsupportedOperationException();
  8. }
  9. protected void remove(OrganizationComponent organizationComponent) {
  10. //默认实现
  11. throw new UnsupportedOperationException();
  12. }
  13. //构造器
  14. public OrganizationComponent(String name, String des) {
  15. super();
  16. this.name = name;
  17. this.des = des;
  18. }
  19. //方法print, 做成抽象的, 子类都需要实现
  20. protected abstract void print();
  21. }

学校

  1. //University 就是 Composite , 可以管理College
  2. @Getter
  3. public class University extends OrganizationComponent {
  4. List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();
  5. // 构造器
  6. public University(String name, String des) {
  7. super(name, des);
  8. // TODO Auto-generated constructor stub
  9. }
  10. // 重写add
  11. @Override
  12. protected void add(OrganizationComponent organizationComponent) {
  13. // TODO Auto-generated method stub
  14. organizationComponents.add(organizationComponent);
  15. }
  16. // 重写remove
  17. @Override
  18. protected void remove(OrganizationComponent organizationComponent) {
  19. // TODO Auto-generated method stub
  20. organizationComponents.remove(organizationComponent);
  21. }
  22. // print方法,就是输出University 包含的学院
  23. @Override
  24. protected void print() {
  25. // TODO Auto-generated method stub
  26. System.out.println("--------------" + getName() + "--------------");
  27. //遍历 organizationComponents
  28. for (OrganizationComponent organizationComponent : organizationComponents) {
  29. organizationComponent.print();
  30. }
  31. }
  32. }

学院

  1. @Getter
  2. public class College extends OrganizationComponent {
  3. //List 中 存放的Department
  4. List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();
  5. // 构造器
  6. public College(String name, String des) {
  7. super(name, des);
  8. // TODO Auto-generated constructor stub
  9. }
  10. // 重写add
  11. @Override
  12. protected void add(OrganizationComponent organizationComponent) {
  13. // TODO Auto-generated method stub
  14. // 将来实际业务中,Colleage 的 add 和 University add 不一定完全一样
  15. organizationComponents.add(organizationComponent);
  16. }
  17. // 重写remove
  18. @Override
  19. protected void remove(OrganizationComponent organizationComponent) {
  20. // TODO Auto-generated method stub
  21. organizationComponents.remove(organizationComponent);
  22. }
  23. // print方法,就是输出University 包含的学院
  24. @Override
  25. protected void print() {
  26. // TODO Auto-generated method stub
  27. System.out.println("--------------" + getName() + "--------------");
  28. //遍历 organizationComponents
  29. for (OrganizationComponent organizationComponent : organizationComponents) {
  30. organizationComponent.print();
  31. }
  32. }
  33. }

部门

  1. public class Department extends OrganizationComponent {
  2. //没有集合
  3. public Department(String name, String des) {
  4. super(name, des);
  5. // TODO Auto-generated constructor stub
  6. }
  7. //add , remove 就不用写了,因为他是叶子节点
  8. @Override
  9. public String getName() {
  10. // TODO Auto-generated method stub
  11. return super.getName();
  12. }
  13. @Override
  14. public String getDes() {
  15. // TODO Auto-generated method stub
  16. return super.getDes();
  17. }
  18. @Override
  19. protected void print() {
  20. // TODO Auto-generated method stub
  21. System.out.println(getName());
  22. }
  23. }

客户端测试代码

  1. public class Client {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. //从大到小创建对象 学校
  5. OrganizationComponent university = new University("清华大学", " 中国顶级大学 ");
  6. //创建 学院
  7. OrganizationComponent computerCollege = new College("计算机学院", " 计算机学院 ");
  8. OrganizationComponent infoEngineercollege = new College("信息工程学院", " 信息工程学院 ");
  9. //创建各个学院下面的系(专业)
  10. computerCollege.add(new Department("软件工程", " 软件工程不错 "));
  11. computerCollege.add(new Department("网络工程", " 网络工程不错 "));
  12. computerCollege.add(new Department("计算机科学与技术", " 计算机科学与技术是老牌的专业 "));
  13. //
  14. infoEngineercollege.add(new Department("通信工程", " 通信工程不好学 "));
  15. infoEngineercollege.add(new Department("信息工程", " 信息工程好学 "));
  16. //将学院加入到 学校
  17. university.add(computerCollege);
  18. university.add(infoEngineercollege);
  19. //university.print();
  20. infoEngineercollege.print();
  21. }
  22. }