이 기사에서는 학생들이 휴가를 떠날 수있는 책임 체인 모드 사용에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
1. 패턴 정의
책임 모델에서 많은 객체가 각 물체에 의해 다음 집에 대한 참조로 연결되어 체인을 형성합니다. 체인의 개체가 요청을 처리하기로 결정할 때까지 클라이언트 응용 프로그램 요청 이이 체인에 전달됩니다. 이 요청을하는 클라이언트는 체인의 어떤 객체가 궁극적으로 요청을 처리하는지 알지 못하므로 시스템이 체인을 동적으로 재구성하고 고객에게 영향을 미치지 않고 책임을 지정할 수 있습니다.
(1) 추상 프로세서 역할 : 처리 요청을위한 인터페이스를 정의합니다. 필요한 경우 인터페이스는 다음 주택에 대한 참조를 설정하고 반환하는 메소드를 정의 할 수 있습니다. 이 역할은 일반적으로 Java Abstract 클래스 또는 Java 인터페이스에 의해 구현됩니다.
(2) 특정 처리 역할 : 요청을받은 후, 특정 프로세서는 요청을 처리하거나 요청을 다음 주택으로 전달하도록 선택할 수 있습니다.
2. 모델 예제
1 패턴 분석
우리는이 모델을 설명하기 위해 학생들의 휴가를 빌립니다
2 책임 체인 패턴의 정적 클래스 다이어그램
3 코드 예제
3.1 학생 인터페이스
Com.demo.chain.message;/** * 학생 인터페이스 * * @author * */public interface istudent {/** * 학생의 조건 상태 얻기 * * 0 : 작은 것들 (클래스 모니터가 처리 할 수 있음) * * 1 : 교사가 처리 할 수있는 것들을 다룰 수 없습니다 * * 2 : 교사가 원칙적으로 처리 할 수없는 것을 처리 할 수 없습니다. / ** * 학생의 휴가 메시지 받기 * * @return */ public String getRequestMessage ();}3.2 학생들은 학생을 알고 있습니다
패키지 com.demo.chain.message;/** * 학생 구현 클래스 * * @author * */public class student implements istudent {// 상태의 크기 개인 int state = -1; // 작별 메시지 개인 최종 문자열 메시지; 공개 학생 (int State, String Message) {this.state = state; this.message = 메시지; } / ** * 학생이 떠나는 상태를 얻으십시오 * * 0 : 작은 것들 (클래스 모니터는 처리 할 수 있습니다) * * 1 : 교사가 처리 할 수있는 것들을 처리 할 수 없습니다 * * * 2 : 교장이 대표가 처리 할 수있는 것을 처리 할 수 없습니다. * * * / public int getstate () {return this.state; } / ** * 학생 방치 메시지를 받기 * * @return * / public String getRequestMessage () {return this.message; }}3.3 초록 처리 인터페이스 -ihandler
package com.demo.chain.handle; import com.demo.chain.message.istudent;/** * 초록 프로세서 인터페이스 * * @author */public interface ihandler {// 프로세스 요청 공개 void handlerequest (istudent 학생); // 다음 핸들러 설정 공개 void Sethandler (ihandler handler);}3.4 ABSTRACTHANDLER
package com.demo.chain.handle; import com.demo.chain.chain.message.istudent;/** * Abstract Handler * * @author * */public arbost class Abstracthandler Imberments ihandler {// next handler private ihandler handler; // Leave Level Private int State = -1; // 생성자 설정 레벨 public Abstracthandler (int state) {this.state = state; } // 특정 처리 공개 추상적 공허 프로세스를 처리하기 위해 서브 클래스에 대한 요청을 처리합니다 (istudent 학생); // hands requests public void handlerequest (istudent student) {// 학생 객체가 존재하는 경우 (학생! = null) {if (this.State == whening.getState ()) {// 휴가 레벨이 현재와 일치하면 현재 객체가 처리됩니다. } else {if (this.handler! = null) {System.out.println ( "대단한 리더에게 답장을 요청하십시오!"); // 현재 객체를 처리 할 수없는 경우 다음 프로세서로 전달됩니다. }}}}} // 다음 프로세서를 설정하여 공개 void sethandler (ihandler handler) {this.handler = handler; }}3.5 분대장 핸들러
package com.demo.chain.handle; import com.demo.chain.chain.message.istudent;/** * Abstract Handler * * @author * */public arbost class Abstracthandler Imberments ihandler {// next handler private ihandler handler; // Leave Level Private int State = -1; // 생성자 설정 레벨 public Abstracthandler (int state) {this.state = state; } // 특정 처리 공개 추상적 공허 프로세스를 처리하기 위해 서브 클래스에 대한 요청을 처리합니다 (istudent 학생); // hands requests public void handlerequest (istudent student) {// 학생 객체가 존재하는 경우 (학생! = null) {if (this.State == whening.getState ()) {// 휴가 레벨이 현재와 일치하면 현재 객체가 처리됩니다. } else {if (this.handler! = null) {System.out.println ( "대단한 리더에게 답장을 요청하십시오!"); // 현재 객체를 처리 할 수없는 경우 다음 프로세서로 전달됩니다. }}}}} // 다음 프로세서를 설정하여 공개 void sethandler (ihandler handler) {this.handler = handler; }}3.6 교사-교사 핸들러
package com.demo.chain.impl; import com.demo.chain.handle.abstracthandler; import com.demo.chain.message.istudent;/** * 교사 핸들러 * * @author * */public class hacrandler {public teacherhandler () {super (1); } // 서브 클래스 특정 처리 요청 @override public void process (istudent student) {System.out.println ( "교사의 답변 :" + whity.getRequestMessage ()); }}3.7 교장 학교 마스터 핸들러
Package com.demo.chain.impl; import com.demo.chain.handle.bsstracthandler; import com.demo.chain.message.istudent;/** * Principal Handler * * @author * */Public Class Schoolmasterhandler는 AbstracThandler {Public SchoolmasterHandler () {Super (2); } // 서브 클래스 특정 처리 요청 @override public void process (istudent student) {System.out.println ( "Principal 's Reply :" + whity.getRequestMessage ()); }}3.8 외관 클래스 1 프로세스 핸들러
package com.demo.chain.process; import com.demo.chain.handle.ihandler; import com.demo.chain.impl.schoolmasterhandler; import com.demo.chain.impl.squadleaderhandler; import com.demo.chain.impl.teacherhandler; import com.demo.chain.chain. 체인 협회 * * @author */public class processHandler {// 클래스 리더 핸들러 비공개 최종 INHANDLER SQMSHANDLER; // 교사 핸들러 개인 최종 결승 INHANDLER TECHANDLER; // Principal Handler Private Final Ihandler scmshandler; // 싱글 톤 모드 개인 정적 프로세스 핸들러 프로세서 핸들러 = new ProcessHandler (); / *** 휴가 처리에 대한 책임 체인을 설정하는 생성자 방법*/ private processHandler () {// 프로세스 개체 생성 // 클래스 리더 this.sqmshandler = new SquadleaderHandler (); // 교사 this.techhandler = new TeacherHandler (); // Principal this.scmshandler = New SchoolmasterHandler (); / *** 책임 체인 설정*// // 클래스 리더의 다음 처리기를 설정하십시오. 교사 this.sqmshandler.sethandler (this.techhandler); // 교사의 다음 핸들러를 설정하십시오. Principal this.techhandler.sethandler (this.scmshandler); } / ** * 싱글 톤 객체 인스턴스 가져 오기 * * @return * / public static processHandler getInstance () {return processHandler; } / ** * 휴가 요청 보내기 * * @param 메시지 * / public void sendmessage (istudent student) {// 첫 핸들러로 보내기 : 클래스 리더는 hands.sqmshandler.handlerequest (학생); }}3.9 클라이언트 클라이언트
package com.demo; import java.util.random; import com.demo.chain.message.istudent; import com.demo.chain.chain.message.student; import com.demo.chain.process.processhandler;/** * main application */public class client {/** * @param args */** * @param args */** * @param args */** * @porshandler; args) {// 모양 객체 프로세스 핸들러 프로세서 핸들러 = processHandler.getInstance (); // 무작위 숫자 객체를 생성하여 무작위로 학생 개체를 생성합니다 random random = new Random (); for (int i = 0; i <3; i ++) {// 랜덤 번호를 얻습니다 int radom = random.nextint (3); ISTUDENT 학생 = 신입생 (Radom, "학생" + I + "나는 아프다. 나는 휴가를 원한다!"); System.out.println("##################################################################################### ########################################################################################################## ########################################################################################################## #######################################################################################################"); // 메시지 processHandler.SendMessage (학생)를 처리합니다. system.out.println ( "###################################/n"); }}}4 실행 결과
###################################################
우월한 지도자에게 답장을 요청하십시오!
우월한 지도자에게 답장을 요청하십시오!
교장의 대답 : 학생 0은 아프고 휴가를 원합니다!
###################################################
###################################################
우월한 지도자에게 답장을 요청하십시오!
우월한 지도자에게 답장을 요청하십시오!
교장의 대답 : 학생 1은 아프고 휴가를 원합니다!
###################################################
###################################################
클래스 모니터 승인 : 학생 2는 아프고 휴가를 원합니다!
###################################################
III. 이 패턴의 디자인 원리
1 "개방형"원칙
2 단일 책임 원칙
4. 행사를 사용하십시오
(1) 동일한 요청을 처리하는 여러 개체가 있습니다. 어느 것이 그것을 처리하는 데 사용되는지는 여전히 확실하지 않습니다. 런타임에만 객체가 처리하는 경우에만 결정됩니다.
(2) 메시지에는 수신자가 여러 명이며 수신 객체는 불분명합니다. 객체 중 하나에 메시지를 보내고 내부적으로 처리하면됩니다.
(3) 동일한 메시지의 다중 처리 객체는 동적으로 증가하거나 감소 할 수 있으며 동적으로 지정해야합니다.
5. 책임 체인 패턴의 정적 클래스 다이어그램
더 많은 Java 관련 컨텐츠를 보려면이 사이트에 관심이있는 독자는 "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약 및"Java Cache Cache Operation Tips "의 주제를 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.