내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Chain of Responsibility Pattern은 여러 객체가 요청을 순차적으로 처리할 수 있도록 하는 행동 설계 패턴으로, 각 객체는 요청을 처리할지 아니면 다음 객체로 전달할지 선택할 수 있습니다. 이 패턴은 요청의 발신자와 수신자를 분리하여 더 큰 유연성과 확장성을 제공합니다. 다음은 책임 사슬 모델에 대한 자세한 소개입니다.
책임 체인 모델의 핵심은 요청 체인을 설계하고 체인 끝을 식별하는 것입니다. 여러 요청 처리 개체를 체인으로 연결하고 체인의 개체가 요청을 처리하기로 결정할 때까지 요청이 체인을 통해 전달되도록 허용합니다. 요청을 하는 클라이언트는 체인의 어떤 개체가 궁극적으로 요청을 처리할지 알지 못하므로 시스템은 클라이언트에 영향을 주지 않고 동적으로 재구성하고 책임을 할당할 수 있습니다.
클래스 다이어그램:
책임 사슬 모델에는 주로 다음과 같은 역할이 포함됩니다.
추상 핸들러(Handler) : 요청 처리를 위한 인터페이스를 정의합니다. 필요한 경우 인터페이스는 다음 인터페이스에 대한 참조를 설정하고 반환하는 메서드를 정의할 수 있습니다. 이 역할은 일반적으로 추상 클래스나 인터페이스에 의해 구현됩니다.
콘크리트 핸들러 : 요청을 받은 후 특정 프로세서는 요청을 처리할지 아니면 다음 당사자에게 요청을 전달할지 선택할 수 있습니다. 콘크리트 프로세서는 다음 홈에 대한 참조를 보유하므로 필요한 경우 콘크리트 프로세서는 다음 홈에 액세스할 수 있습니다.
클라이언트 클래스(클라이언트): 처리 체인을 생성하고 체인 헤드의 특정 프로세서 개체에 요청을 제출합니다.
책임 사슬 모델은 다음 시나리오에 적합합니다.
여러 개체가 공동으로 작업을 처리합니다.: 예를 들어 다단계 결재 시스템은 최종 결재 결과가 나올 때까지 결재자의 권한과 등급을 기준으로 다음 결재자에게 결재요청을 전달하는 시스템이다.
동적 조합 처리 흐름: 책임 사슬을 유연하게 구성함으로써 처리 개체를 동적으로 결합하여 다양한 처리 프로세스를 구현할 수 있습니다.
요청의 발신자와 수신자 간의 직접적인 결합을 피하세요.: 요청을 책임 체인에 전달함으로써 요청 보낸 사람은 특정 처리 개체를 알 필요가 없으므로 개체 간의 종속성이 줄어듭니다.
책임 사슬 모델은 다음을 포함하되 이에 국한되지 않는 다양한 분야에서 널리 사용됩니다.
다음은 로그 메시지를 처리하고 로그 수준(예: DEBUG, INFO, WARN, ERROR)에 따라 메시지를 다른 프로세서에 전달하는 데 사용되는 책임 체인 패턴의 간단한 구현 예입니다.
- // 抽象处理者
- abstract class LogHandler {
- protected int level;
- protected LogHandler nextHandler;
-
- public void setNextHandler(LogHandler nextHandler) {
- this.nextHandler = nextHandler;
- }
-
- //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
- public void logMessage(int level, String message) {
- if (this.level <= level) {
- write(message);
- }
- if (nextHandler != null) {
- nextHandler.logMessage(level, message);
- }
- }
-
- abstract protected void write(String message);
- }
-
- // 具体处理者:ErrorLogHandler
- class ErrorLogHandler extends LogHandler {
- public ErrorLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("ErrorLogHandler: " + message);
- }
- }
-
- // 具体处理者:WarnLogHandler
- class WarnLogHandler extends LogHandler {
- public WarnLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("WarnLogHandler: " + message);
- }
- }
-
- // 具体处理者:InfoLogHandler
- class InfoLogHandler extends LogHandler {
- public InfoLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("InfoLogHandler: " + message);
- }
- }
-
- // 客户端代码
- public class ChainPatternDemo {
- private static LogHandler getChainOfLoggers() {
- // 创建链中的处理者
- LogHandler errorLogHandler = new ErrorLogHandler(3);
-
- LogHandler warnLogHandler = new WarnLogHandler(2);
- warnLogHandler.setNextHandler(errorLogHandler);
-
- LogHandler infoLogHandler = new InfoLogHandler(1);
- infoLogHandler.setNextHandler(warnLogHandler);
-
- return infoLogHandler;
- }
-
- public static void main(String[] args) {
- LogHandler loggerChain = getChainOfLoggers();
-
- loggerChain.logMessage(1, "This is an informational message.");
- loggerChain.logMessage(2, "This is a warning message.");
- loggerChain.logMessage(3, "This is an error message.");
- }
- }
이 예에서는 세 가지 구체적인 로그 처리기 클래스를 정의합니다(ErrorLogHandler
、WarnLogHandler
、InfoLogHandler
) 각각 다른 수준의 로그 메시지를 처리합니다. 각 핸들러에는 레벨(level
), 이 수준의 메시지를 처리해야 하는지 여부를 결정하는 데 사용됩니다.전화로logMessage
메소드를 사용하면 요청이 체인의 첫 번째 핸들러로 전달됩니다(infoLogHandler
), 자체 수준 및 처리 논리에 따라 메시지를 처리할지 여부를 결정한 다음 (처리되지 않은 경우) 요청을 체인의 다음 프로세서로 전달합니다. 이 프로세스는 체인이 끝날 때까지 또는 요청이 처리될 때까지 계속됩니다.
실제 애플리케이션에서는 다음이 필요할 수 있습니다.LogHandler
이 클래스는 더 복잡한 로그 처리 논리 및 구성을 지원하기 위해 더 많은 메서드와 속성을 추가합니다. 또한 로그 수준은 일반적으로 열거형(enum
)를 정수 대신 사용하여 코드 가독성과 유지 관리성을 향상시킵니다.
책임 체인 패턴은 요청을 처리하는 여러 객체를 체인으로 연결하고 체인의 객체가 요청을 처리하기로 결정할 때까지 요청이 체인을 통과하도록 허용함으로써 유연한 요청 처리 및 시스템 확장성을 달성합니다.
책임 사슬 모델이 당신에게 유용하다면, 좋아요를 누르고 수집하는 것을 잊지 마세요.