이 예제는 회사의 조직 구조를 나타내는 기능을 구현하기 위해 조합 모드를 사용하는 것을 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
1. 패턴 정의
조합 모드 : 객체를 트리 구조로 결합하여 "부분적으로 전체"계층을 나타냅니다. 조합 모드는 사용자가 개별 객체 및 결합 된 객체의 사용과 일치하게 만듭니다.
2. 조합 모드의 예
1 패턴 분석
우리는이 모델을 설명하기 위해 회사의 조직 차트를 빌려줍니다.
분석 후 다음과 같이이 패턴의 정적 클래스 다이어그램을 얻습니다.
2 코드 예제
2.1 직원 추상 클래스를 설정하십시오
패키지 com.demo.composite;/** * 직원 클래스 인터페이스 * * @author */public Abstract 클래스 직원 {// 직원 번호 보호 문자열 번호; // 직원 이름 보호 문자열 이름; // 보호 된 문자열 위치 위치; // 급여 보호 플로트 급여; // 사유 속성 길이 문자열 프라이빗 int 길이; // 구성 메소드 공공 직원 (문자열 번호, 문자열 이름, 문자열 위치, 플로트 급여) {this.No = no; this.name = 이름; this.position = 위치; this.salary = 급여; // 총 바이트 길이를 계산하십시오. length += (no == null || "".equals (no.trim ()))? 0 : no.getBytes (). 길이; this.length += (name == null || "".equals (name.trim ()))? 0 : 이름 .getBytes (). 길이; this.length += (position == null || "".equals (position.trim ()))? 0 : position.getBytes (). 길이; this.length += string.valueof (Salary) .getBytes (). 길이; } // 기본 사용자 정보 가져 오기 공개 void printUserBaseInfo () {System.out.println ( "|" + this.No + "" + this.Name + "" + this. this. this. this. this.salary); } // 직원 정보 추가 공개 초록 void Add (직원); // 직원 공개 추상 직원 제거 (문자열 번호); // 인쇄 직원 정보 공개 초록 void printemployeesInfo (int layer); // 여러 문자 보호 void printchar (int layer) {for (int j = 0; j <layer * 2; j ++) {System.out.print ( "-"); }} // private method를 인쇄하는 줄 보호 void printline () {system.out.print ( "+"); for (int i = 0; i <this.length+4; i ++) {system.out.print ( "-"); } system.out.println ( "-"); } public String getNo () {return no; } public void setno (문자열 번호) {this.no = no; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public String getPosition () {리턴 위치; } public void setPosition (문자열 위치) {this.position = 위치; } public float getSalary () {반환 급여; } public void setsalary (float andalary) {this.salary = 월급; }}2.2 관리자를 만듭니다
package com.demo.composite.sub; import java.util.arraylist; import com.demo.composite.staff;/** * 관리자 (명령에 따라 다른 직원이있는 사람) * * @author */public class manager 직원 확장 {// 직원에 대한 정보 저장 사적 최종 배열 <splainlist = newraylist <splustry <splustry <splust> (); // 구성 메소드 공용 관리자 (문자열 번호, 문자열 이름, 문자열 위치, 플로트 급여) {super (no, 이름, 위치, 급여); } / *** 직원 추가* / @override public void add (직원 직원) {this.arraylist.add (직원); } / *** 직원 정보 삭제* / @override 공공 직원 제거 (문자열 번호) {직원 직원 = null; if (no! = null &&! "". } if (no.equals (this.arraylist.get (i) .getno ())) {직원 = this.arraylist.remove (i); 부서지다; }}} 직원 반환; } / *** 인쇄 직원 정보* / @Override public void printemployeesinfo (int layer) {int tmplayer = ++ 레이어; for (int i = 0; i <this.arraylist.size (); i ++) {if (this.arraylist.get (i) == null) {계속; } // print '-'printchar (tmplayer); // 기본 직원 정보 인쇄 this.arrayList.get (i) .printuserBaseInfo (); // 게시물 아래에서 직원 정보를 인쇄 this.arraylist.get (i) .printemployeesinfo (tmplayer); }}}2.3 평범한 직원을 만드십시오
package com.demo.composite.sub; import com.demo.composite.staff;/** * 평범한 직원 (실제로 작동) * * @author * */공공 클래스 직원은 직원을 확장합니다 {// 공무원 구성 (문자열 번호, 문자열 이름, 문자열 위치, 플로트 급여) {슈퍼 (아니, 이름, 위치, 위치); } / *** 직원 정보 추가* / @override public void add (직원 직원) {return; } / *** 직원 정보 삭제* / @override 공공 직원 제거 (문자열 번호) {// null return null return null; } / *** 인쇄 직원 정보* / @override public void printemployeesinfo (int layer) {return; }}2.4 클라이언트 테스트
package com.demo; import com.demo.composite.staff; import com.demo.composite.sub.employees; import com.demo.composite.sub.manager;/** * 메인 응용 프로그램 * * @author * */public class client {/** * @param args */public static void main (string [] argss) {// Company Ceo = news ( "," "," "" 보스 ","CEO ", 100000); / *** CEO는 여러 부서 관리자를 보유하고 있습니다* // 금융 부서 관리자 직원 FinanceManager = New Manager ( "11", "Zhang 회장", "재무 부서 관리자", 60000); // 직원 직원 관리자 = New Manager ( "12", "Wang 대통령", "대통령 관리자", 60000); // 직원 기술 관리자 = New Manager ( "13", "Chen 회장", "기술 부서 관리자", 60000); / *** 기술 부서에는 보조원과 몇몇 감독자가 있습니다* // 직원 Deptassistant = New Manager ( "1301", "Assistant Wang", "Department Assistant", 20000); // 기술 부서 관리자 직원 DeptManager1 = New Manager ( "1302", "Supervisor1", "기술 감독자", 30000); / ** * 기술 감독자 DeptManager1 소프트웨어 엔지니어 (결국 일하는 사람) */ 직원 SoftwareEngineer1 = 신입 사원 ( "1302001", "Zhang San", "Software Engineer", 5000); 직원 SoftwareEngineer2 = 신입 사원 ( "1302002", "Li Si", "Software Engineer", 5500); 직원 SoftwareEngineer3 = 신입 사원 ( "1302003", "Wang Wu", "Software Engineer", 4500); // 기술 이사에 대한 직원 정보 추가 1 DeptManager1.add (SoftwareEngineer1); deptmanager1.add (SoftwareEngineer2); deptmanager1.add (SoftwareEngineer3); // 기술 부서 디렉터 2 직원 DeptManager2 = New Manager ( "1303", "Supervisor2", "Technical Director", 30000); // 기술 부서 관리자에 추가 : 부서 보조, 기술 담당 이사 1 및 기술 담당 이사 2 TechnicalManager.add (deptassistant); TechnicalManager.add (deptManager1); TechnicalManager.add (deptmanager2); // 마케팅 관리자 직원 마케팅 관리자 = 새로운 관리자 ( "14", "Mr. Wu", "Market Manager", 60000); // CEO에 추가 : 재무 부서 관리자, 인사 부서 관리자, 기술 부서 관리자 및 마케팅 관리자 BOSS.ADD (FinanceManager); boss.add (인사 관리자); boss.add (기술 관리자); boss.add (마케팅 관리자); // 인쇄 CEO Information Boss.printuserBaseInfo (); // 인쇄 CEO Employee Information Boss.printemployeesinfo (1); }}작업 결과는 다음과 같습니다.
| 1 빅 보스 CEO 100000.0
--- | 11 장 재무 부서 관리자 60000.0
--- | 12 일반 왕인 자원 부서 관리자 60000.0
--- | 13 General Chen 기술 부서 관리자 60000.0
------ | 1301 Wang Department Assistant 20000.0
----- | 1302 감독자 1 기술 감독관 30000.0
------- | 1302001 Zhang San 소프트웨어 엔지니어 5000.0
------- | 1302002 LI SI 소프트웨어 엔지니어 5500.0
------- | 1302003 Wang Wu 소프트웨어 엔지니어 4500.0
------ | 1303 감독자 2 기술 감독관 30000.0
--- | 14 총괄 책임자 WU 마케팅 부서 60000.0
3.이 모델의 디자인 원리
1 개별 및 결합 된 물체를 균일하게 처리합니다
2 초록 지향 프로그래밍
4. 행사를 사용하십시오
1 객체의 "부분 및 전체"계층을 나타내려고 할 때.
2 사용자가 결합 된 객체와 단일 객체의 차이를 무시하려면 사용자는 결합 된 구조의 모든 객체를 균일하게 사용합니다.
조합 모드의 정적 클래스 다이어그램은 다음과 같습니다.
Java 알고리즘에 대한 자세한 내용은이 사이트에 관심이있는 독자들이 주제를 볼 수 있습니다. "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약"및 "Java Cache Operation Tips의 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.