이 기사에서는 회사의 계층 구조 다이어그램 문제를 해결하기 위해 방문자 모드를 사용하는 방법에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
1. 패턴 정의
방문자 모드 : 객체 구조에서 각 요소에 작용하는 작업을 나타냅니다. 이를 통해 사용자는 각 요소의 클래스를 변경하지 않고 이러한 요소에 작용하는 새로운 작업을 정의 할 수 있습니다.
2. 모델 예제
1 패턴 분석
우리는이 모델을 설명하기 위해 회사 계층을 빌려줍니다.
2 방문자 모드 정적 클래스 다이어그램
3 코드 예제
3.1 초록 직원
패키지 com.demo.structure; import com.demo.visitor.ivisitor;/** * Abstract Employee Class * * @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 : position.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 accept (ivisitor visitor); 공개 문자열 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 = 월급; }}3.2 관리자
package com.demo.structure; import java.util.arraylist; import com.demo.visitor.ivisitor;/** * 관리자 (명령에 따라 다른 직원이있는 사람) * * @author * */public class manager는 직원을 확장합니다 {// 직원에 대한 정보 저장 사적 최종 배열 <splainlist = newraylist <stlast> (); // 구성 메소드 공용 관리자 (문자열 번호, 문자열 이름, 문자열 위치, 플로트 급여) {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 accept (ivisitor visitor) {// 자신의 방문자에 액세스합니다 .Visit (this); // 목록 목록에 다양한 요소 객체를 통과하고 (int i = 0; i <this.arraylist.size (); i ++) {if (this.arraylist.get (i) == null) {계속; } // 방문자 객체를 받으십시오. }}}3.3 평범한 직원
package com.demo.structure; import com.demo.visitor.ivisitor;/** * 평범한 직원 (실제 직원) * * @author */public class 직원은 직원을 확장합니다 {// 공무원 구성 (문자열 없음, 문자열 이름, 문자열 위치, 플로트 급여) {슈퍼 (No, 이름, 위치, 급여); } / *** 직원 정보 추가* / @override public void add (직원 직원) {return; } / *** 직원 정보 삭제* / @override 공공 직원 제거 (문자열 번호) {// NULL을 NULL로 직접 반환합니다. } // 방문자 객체를받습니다. public void accept (ivisitor visitor) {visitor.visit (this); }}3.4 방문자 인터페이스-이소자
package com.demo.visitor; import com.demo.structure.employees; import com.demo.structure.manager;/** * 방문자 인터페이스 * * @author */public interface ivisitor {// Access Manager public void visit (관리자 관리자); // 일반 직원 액세스 공개 방문 (직원 직원);}3.5 직원 기본 정보 방문자 PrintBaseInfovistor
package com.demo.visitor; import com.demo.structure.employees; import com.demo.structure.manager;/*** 인쇄 기본 정보 방문자 인쇄** @author**/public class printbaseinfovisitor ivisitor {/*** Access Manager*/public void visit (관리자) {System.out.out.print.print ( "); manager.printuserbaseinfo (); } / *** 평범한 직원 개체 액세스* / public void visit (직원 직원) {System.out.print ( "- 일반 직원 :"); 직원 .printuserbaseinfo (); }}3.6 직원 급여를위한 방문자 인터페이스 생성 -Isalaryvistor
패키지 com.demo.visitor;/** * 급여 방문자 계산 * * @author */public interface isalaryvisitors 확장 ivisitor {// 통계 관리자 급여 공개 void printmanagertalary (); // 통계 일반 직원 급여 공개 공공 공인 printemployeestotalary (); // 통계 모든 직원 급여 공개 공개 void printToTalary ();}3.7 직원 급여 통계 및 월급을 실현하기위한 방문자
package com.demo.visitor; import com.demo.structure.emporde.employees; import com.demo.structure.manager;/** * 급여 방문자 계산의 특정 구현 * * @author */public class salaryvisitor implements isalaryvisitor {// Total Manager private float managersalary; // 일반 직원의 총 급여 개인 플로트 Employeessalary; 퍼블릭 샐러드 비비터 () {ManagersAlary = 0; Employeessalary = 0; } // Access Manager Public Void Visit (관리자 관리자) {ManagersAlary += manager.getSalary (); } // 일반 직원 방문 공개 방문 (직원 직원) {Employeessalary += 직원 .getSalary (); } // 통계 통계 일반 직원의 급여 공개 void printemployeestotalary () {System.out.println ( "일반 직원 급여 금액 :" + Employeessalary); } // 관리자의 급여 공개 void printManagerToTalary () {System.out.println ( "관리자 급여 합계 :" + ManagersAlary); } // 모든 직원의 급여 통계 공개 void printTotallary () {System.out.println ( "고용주 급여 :" + (ManagersAlary + Employeessalary)); }}3.8 클라이언트 테스트 클라이언트
package com.demo;import com.demo.structure.Employees;import com.demo.structure.Manager;import com.demo.structure.Staff;import com.demo.visitor.PrintBaseInfoVisitor;import com.demo.visitor.SalaryVisitor;/** * Main application* * @author * */public class Client { /** * @param args */ public static void main (String [] args) {// 회사 CEO 직원 Boss = New Manager ( "1", "Big Boss", "CEO", 100000); / *** CEO에는 여러 부서 관리자가 있습니다* // 금융 부서 관리자 직원 FinanceManager = New Manager ( "11", "Zhang 회장", "재무 관리자", 60000); // 인적 자원 부서 관리자 직원 인사 관리자 = 새로운 관리자 ( "12", "대통령", "대통령 관리자", 60000); // 기술 부서 관리자 직원 TechnicalManager = New Manager ( "13", "Chen 회장", "기술 부서 관리자", 60000); / *** 기술 부서에는 보조원과 몇몇 감독자가 있습니다* // 기술 부서 보조 직원 Deptassistant = New Manager ( "1301", "Assistant Wang", "Department Assistant", 20000); // 기술 부서 Director1 직원 DeptManager1 = New Manager ( "1302", "Supervisor1", "Technical Director", 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 정보 // boss.printuserBaseInfo (); // CEO의 직원 정보 보스를 인쇄합니다. / *** 통계 직원 급여* // 통계 생성 직원 급여 방문자 급여 방문자 방문자 = New Salaryvisitor (); // 빅 보스가 방문자 보스를 받아들이게하십시오. // 관리자 급여 통계 방문자 .printmanagerToTalary (); // 일반 직원 급여 통계 방문자 .printemployeestotalary (); // 모든 직원 급여 통계 방문자 .printtotalary (); }}4 실행 결과
- 관리자 : - | 1 BIG BOSS 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
총 관리자 급여 : 420,000.0
일반 직원의 총 급여 : 15000.0
총 직원 급여 : 435,000.0
III. 이 패턴의 디자인 원리
1 "개방형"원칙
2 단일 책임 원칙
4. 행사를 사용하십시오
1 객체 구조에 다양한 유형의 객체를 포함 시키면 인터페이스가 다르며 이러한 다른 객체의 특정 클래스에 의존하는 일부 작업을 구현하려고합니다.
2 객체 구조의 객체에 대해 여러 가지 다른 및 관련없는 작업을 수행해야하며 이러한 작업을 이러한 객체의 클래스와 관련시키지 않기를 원합니다. 방문자 모드를 사용하면 관련 작업이 클래스에서 별도로 중앙 집중화되고 정의 될 수 있습니다.
3이 객체 구조가 많은 응용 프로그램에서 공유되는 경우 방문자 모드를 사용하여 각 응용 프로그램에 사용해야하는 작업 만 포함하도록합니다.
4 객체 구조를 정의하는 클래스는 거의 변하지 않지만이 구조에서 정의하려면 종종 새로운 작업이 필요합니다.
5. 방문자 모드 정적 클래스 다이어그램
더 많은 Java 관련 컨텐츠를 보려면이 사이트에 관심이있는 독자는 "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약 및"Java Cache Cache Operation Tips "의 주제를 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.