Latest web development tutorials

책임 패턴의 체인

이름에서 알 수 있듯이, 요청에 대한 책임 패턴 (책임 패턴의 체인)의 체인은 수신기 객체의 체인을 만들 수 있습니다. 패턴이 종류의 요청 디커플링의 요청 발신자와 수신자에게 주어진. 디자인 패턴이 유형의 행동 패턴에 속한다.

이 모드에서는 각받는 사람은 일반적으로 다른받는 사람에 대한 참조를 포함합니다. 객체가 상기 요청을 처리 할 수없는 경우, 그 다음 수신자에게 동일한 요청 것이며, 등등.

소개

의도 : 여러 개체가 요청을받을 가능성이 있음을,이 개체가 체인으로 연결할 수 있도록 보낸 사람과받는 사람이 함께 결합 요청하지 않도록하고, 객체가 지금까지 처리 될 때까지 체인을 따라 요청을 전달합니다.

요청을 처리 할 책임 프로세서 프로세서 듀티 체인, 고객은 요청 전송 처리의 내용 및 요구를 염려하지 않아도 할 책임 체인에 요청을 전송해야하므로 책임 체인 및 송신기의요청의 요청 : 메인 솔루션분리.

때 사용하는 : 메시지를 필터링하기 위해 도로를 많이 다룰 때.

차단 클래스는 통일 된 인터페이스를 구현: 어떻게 해결하는.

키 코드 : HanleRequest에서 중합 자체가 적절한 조건이되지 위로, 아래로 통과하는 경우 누구 전에이 세트로 통과 여부를 결정하는 핸들러내부.

적용 예 : 1, 레드 저택의 꿈 "타악기의 패스를 보낼 수 있습니다."2, JS 이벤트는 버블 링. 3, 가공, Struts2 인터셉터, JSP로 서블릿의 필터에 대한 아파치 톰캣에서 자바 웹 인코딩.

장점 : (1)는 커플 링을 감소시킨다.그것은 보낸 사람과받는 사람 디커플링을 요청합니다. 2, 단순화 된 객체입니다. 그래서 오브젝트 체인의 구조를 알 필요가 없다. 도 3은 객체에 할당 임무의 유연성을 향상한다. 체인 구성원을 변경하거나 순서를 동원, 동적 추가를 허용하거나 책임을 삭제함으로써. 도 4는 새로운 요청 핸들러 클래스가 매우 편리 추가한다.

단점 : 1, 요청이 접수되어야합니다 보장 할 수 없습니다.이 시스템 성능에 영향을 줄 수 있지만 사이클 호출 원인이 코드를 디버깅하는 동안 덜 편리. 3, 쉽게 관찰 할 수있는 특성 런타임을 방해 디버깅하지 않을 수 있습니다.

사용 시나리오 :도 1은 하나 이상의 개체가 자동으로 실행 시간에 의해 결정되는 요청을 처리하는 물체 즉, 동일한 요청을 처리 할 수있다.도 2는 명시하지 않고 복수의 객체에 대한 요청을 제출하기 위해 수신자를 지정. (3)는 일련의 객체를 동적으로 요청을 처리하기 위해 할당 될 수있다.

참고 : Java 웹에서 많은 응용 프로그램에서 발생했습니다.

실현

우리는 자세한 로깅 수준 추상 클래스AbstractLogger를만들 수 있습니다. 우리는 그 다음 레코더의 세 가지 유형AbstractLogger을확장하는만듭니다.이 그에 따라 인쇄하면 각 레벨 로거 메시지는 자신의 수준인지, 그렇지 않은 경우는 다음과 레코더에 메시지를 인쇄되지 않습니다.

책임 패턴 UML 다이어그램의 체인

1 단계

추상 클래스 레코드를 만듭니다.

AbstractLogger.java

공개 추상 클래스 AbstractLogger {
   공공 정적 INT 정보 = 1;
   공공 정적 INT의 DEBUG = 2;
   공공 정적 INT 오류 = 3;

   보호 INT 수준;

   // 다음 요소에 책임 체인은 AbstractLogger nextLogger 보호;

   공공 무효 setNextLogger (AbstractLogger nextLogger) {
      this.nextLogger = nextLogger;
   }

   공공 무효 logMessage (INT 수준, 문자열 메시지) {
      경우 (this.level <= 레벨) {
         (메시지) 쓰기;
      }
      경우 (nextLogger! = NULL) {
         nextLogger.logMessage (레벨, 메시지);
      }
   }

   추상적 인 보호 무효 쓰기 (문자열 메시지);
	
}

2 단계

레코드 클래스를 확장 엔티티 클래스를 만듭니다.

ConsoleLogger.java

공용 클래스 ConsoleLogger는 AbstractLogger를 {확장

   공공 ConsoleLogger (INT 레벨) {
      this.level = 레벨;
   }

   @Override
   보호 무효 쓰기 (문자열 메시지) {		
      에서 System.out.println ( "표준 콘솔 :: 로거 :"+ 메시지);
   }
}

ErrorLogger.java

공용 클래스 ErrorLogger는 AbstractLogger를 {확장

   공공 ErrorLogger (INT 레벨) {
      this.level = 레벨;
   }

   @Override
   보호 무효 쓰기 (문자열 메시지) {		
      에서 System.out.println ( "오류 콘솔 :: 로거 :"+ 메시지);
   }
}

FileLogger.java

공용 클래스 FileLogger는 AbstractLogger를 {확장

   공공 FileLogger (INT 레벨) {
      this.level = 레벨;
   }

   @Override
   보호 무효 쓰기 (문자열 메시지) {		
      에서 System.out.println ( "파일 :: 로거 :"+ 메시지);
   }
}

3 단계

레코더의 다른 유형을 만듭니다. 그들 오차의 다른 레벨을 제공하고 각 레코더의 기록을 설정. 각 로거 레코더 다음 대표는 체인의 일부입니다.

ChainPatternDemo.java

공용 클래스 ChainPatternDemo {
	
   개인 정적 AbstractLogger의 getChainOfLoggers () {

      AbstractLogger errorLogger = 새로운 ErrorLogger (AbstractLogger.ERROR);
      AbstractLogger fileLogger = 새로운 FileLogger (AbstractLogger.DEBUG);
      AbstractLogger consoleLogger = 새로운 ConsoleLogger (AbstractLogger.INFO);

      errorLogger.setNextLogger (fileLogger);
      fileLogger.setNextLogger (consoleLogger);

      errorLogger를 반환;	
   }

   공공 정적 무효 메인 (문자열 []에 args) {
      AbstractLogger loggerChain = getChainOfLoggers ();

      loggerChain.logMessage (AbstractLogger.INFO, 
         "이는 정보이다.");

      loggerChain.logMessage (AbstractLogger.DEBUG, 
         "이것은 디버그 레벨 정보이다.");

      loggerChain.logMessage (AbstractLogger.ERROR, 
         "이 오류 정보이다.");
   }
}

4 단계

출력을 확인합니다.

표준 콘솔 :: 로거 :이 정보입니다.
파일 :: 로거 : 이것은 디버그 레벨 정보이다.
표준 콘솔 :: 로거 : 이것은 디버그 레벨 정보이다.
오류 콘솔 :: 로거 :이 오류 정보입니다.
파일 :: 로거이 오류 정보이다.
표준 콘솔 :: 로거이 오류 정보이다.