1) 부분-전체 패턴이라고도 불리는 복합 패턴은 개체 그룹의 트리 구조를 만들고 개체를 트리 구조로 결합하여 "전체-부분" 계층 관계를 나타냅니다.
2) 조합 모드 부분과 전체 레벨을 표현하기 위해 트리 구조를 기반으로 개체를 결합합니다.
3) 이러한 유형의 디자인 패턴은 구조 모드에 속합니다.
4) 조합 모드를 사용하면 사용자는 단일 개체 및 결합 개체에 액세스할 수 있습니다. 일관성, 즉: 구성이 허용됩니다.
구성 모델에는 주로 세 가지 역할이 포함됩니다.
추상 루트 노드(컴포넌트): 시스템의 각 레벨을 정의합니다. 객체의 공통 방법 및 속성 , 일부 기본 동작 및 속성은 미리 정의될 수 있습니다
분기 노드(복합): 분기 노드의 동작 정의, 하위 노드 저장, 분기 노드와 리프 노드를 결합하여 트리 구조 형성
리프 노드(리프) : 아래에 가지가 없는 리프 노드 객체는 시스템 수준 탐색의 가장 작은 단위입니다
1) 조합 모드는 이러한 문제를 처리해야 할 때 해결합니다. 트리 구조를 생성할 수 있으며, 트리의 노드와 리프를 조작하려는 경우 노드든 리프든 일관된 방식을 제공할 수 있습니다.
2) 해당 다이어그램
1) 응용 예제 요구 사항
학교 학과 구조를 표시하는 프로그램을 작성하십시오. 요구 사항은 학교의 학과 구성을 한 페이지에 표시하라는 것입니다. 여러 대학, 한 대학에는 여러 학과가 있습니다
2) 아이디어 분석 및 다이어그램(클래스 다이어그램)
3) 코드 구현
컴포넌트 복합 객체 선언 인터페이스
package com.zte; public abstract class OrganizationComponent { private String name;// 名字 private String des;// 说明 public String getName() { return name; } public String getDes() { return des; } protected void add(OrganizationComponent organizationComponent) { // 默认实现 throw new UnsupportedOperationException(); } protected void remove(OrganizationComponent organizationComponent) { // 默认实现 throw new UnsupportedOperationException(); } // 构造器 public OrganizationComponent(String name, String des) { this.name = name; this.des = des; } // 方法print,抽象方法 protected abstract void print(); }
컴포지트 비리프 노드
package com.zte; import java.util.ArrayList; import java.util.List; // University 就是 Composite,可以管理College public class University extends OrganizationComponent { List<OrganizationComponent> organizationComponentList = new ArrayList<>(); // 构造器 public University(String name, String des) { super(name, des); } //重写add @Override protected void add(OrganizationComponent organizationComponent) { organizationComponentList.add(organizationComponent); } // 重写remove @Override protected void remove(OrganizationComponent organizationComponent) { organizationComponent.remove(organizationComponent); } @Override protected void print() { System.out.println("==========" + getName() + "========="); for (OrganizationComponent organizationComponent : organizationComponentList) { organizationComponent.print(); } } @Override public String getName() { return super.getName(); } @Override public String getDes() { return super.getDes(); } }
컴포지트 비- 리프 노드
package com.zte; import java.util.ArrayList; import java.util.List; public class College extends OrganizationComponent { // list中存放department List<OrganizationComponent> organizationComponentList = new ArrayList<>(); public College(String name, String des) { super(name, des); } //重写add @Override protected void add(OrganizationComponent organizationComponent) { organizationComponentList.add(organizationComponent); } // 重写remove @Override protected void remove(OrganizationComponent organizationComponent) { organizationComponent.remove(organizationComponent); } @Override protected void print() { System.out.println("==========" + getName() + "========="); for (OrganizationComponent organizationComponent : organizationComponentList) { organizationComponent.print(); } } @Override public String getName() { return super.getName(); } @Override public String getDes() { return super.getDes(); } }
리프 노드
package com.zte; public class Department extends OrganizationComponent { public Department(String name, String des) { super(name, des); } // add和remove方法就不需要再写了 @Override protected void print() { System.out.println("===========" + getName() + "========="); } @Override public String getName() { return super.getName(); } @Override public String getDes() { return super.getDes(); } }
package com.zte; public class Client { public static void main(String[] args) { // 创建大学 OrganizationComponent university = new University("清华大学", "中国最好的大学"); // 创建学院 OrganizationComponent college1 = new College("计算机学院", "计算机学院"); OrganizationComponent college2 = new College("信息工程学院", "信息工程学院"); // 创建各个学院下面的系 college1.add(new Department("软件工程", "软件工程")); college1.add(new Department("网络工程", "网络工程")); college1.add(new Department("计算机科学与技术", "老牌专业")); college2.add(new Department("通信工程", "通信工程")); college2.add(new Department("信息工程", "信息工程")); // 将学院添加到学校中 university.add(college1); university.add(college2); // 打印大学底下的所有院系 university.print(); // 打印学院底下的所有系 college1.print(); } }
1) 클라이언트 작업을 단순화합니다. 클라이언트는 전체 부분이나 노드 리프 문제를 고려하지 않고 일관된 객체만 직면하면 됩니다
2) 확장성이 강합니다. 결합된 개체를 수정해야 할 경우 내부 계층 관계만 조정하면 되며 클라이언트는 변경할 필요가 없습니다. 3) 클라이언트가 복잡한 계층 구조를 만드는 것이 편리합니다. 조합 내부에 주의가 필요합니다. 노드나 리프를 추가하여 복잡한 트리 구조를 만들기 쉽습니다.
4) 조직 구조를 순회해야 하거나 처리 중인 객체가 트리 구조를 가지고 있는 경우
5) 추상화가 매우 까다로운 노드와 리프 사이에 차이가 많은 경우(예: 메서드와 속성이 많이 다른 경우) 조합 모드를 사용하는 것은 적합하지 않습니다
위 내용은 Java 디자인 패턴 구성 패턴 예시 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!