책임 연쇄 패턴과 로거
많이 사용되지는 않음
잘못된 설명이 웹에 많이 돌아다닌다고 하심

위키피디아 예시

Logger 클래스는 추상 클래스로 일반화됨
- 멤버 변수로
Logger타입의next변수

severity 매개변수로 출력할 로그 레벨을 확인함
Logger개체가 출력해야 될logLevels는 로거 개체가 관리severity매개변수로 자신이 출력할 로그 레벨이면 출력함
출력하고 멤버 변수로 가지고 있는 다음 Logger 개체의 message() 메서드 그대로 연쇄 호출
message()메서드 내부에서 호출되는log()메서드는 추상 메서드로 dynamic dispatch

콘솔 창에 출력하는 자식 클래스

이메일

파일

enum 코드에서 values()라는 메서드를 호출하면 enum의 멤버를 배열로 반환함
all이라는 이름으로 래핑

logger 변수에 ConsoleLogger 개체의 참조를 저장
- 모든 로그 레벨을 처리할 수 있음
setNext() 메서드를 연쇄로 호출하고 있음
ConsoleLogger다음은EmailLoggerFUNCTIONAL_MESSAGE,FUNCTIONAL_ERROR두 로그 레벨만 출력
EmailLogger다음은FileLoggerWARNING,ERROR두 로그 레벨만 출력
message() 메서드에서 logLevels.contains(severity) 때문에 로그 레벨에 따라 어떤 로거가 출력할지 달라짐
DEBUG, INFO 레벨 로그는 ConsoleLogger만 처리
FUNCTIONAL_ERROR, FUNCTIONAL_MESSAGE 레벨 로그는 ConsoleLogger, EmailLogger 둘 다 처리

WARNING, ERROR 레벨 로그는 ConsoleLogger, FileLogger 둘 다 처리

내부적으로 책임 연쇄로 호출해주니까 ConsoleLogger 개체 참조를 대입한 logger 변수 하나만 사용하면 되는 것이 장점
setNext()메서드로 지정만 잘 해놓으면 문제 없음
