본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

Chain Of Responsibility 패턴

책임을 다른 객체에 전달해가는 패턴


1. 코드

Check: 각각의 책임을 가질 클래스들의 부모 클래스

  - next : 다음 책임 객체

public abstract class Check {
	
	private String name;
	private Check next;
	
	public Check(String name) {
		this.name = name;
	}
	
	public Check setNext(Check next) {
		this.next = next;
		return next;
	}
	
	public final void validCheck(int num) {
		if (!isValid(num)) {
			System.out.println(num + ":" + name +"에서 오류 발생");
			return;
		}
		
		if (next == null) {
			System.out.println("모든 검사가 완료되었습니다.");
		} else {
			next.validCheck(num);
		}
	}
	
	protected abstract boolean isValid(int num);
}

 

LimitCheck : 책임 클래스1 (limit 보다 작은지 검사)

public class LimitCheck extends Check {
	
	private int limit;

	public LimitCheck(String name, int limit) {
		super(name);
		this.limit = limit;
	}

	@Override
	protected boolean isValid(int num) {
		return num <= limit;
	}
}

 

NotAllowNunCheck: 책임 클래스2 (특정 값인지 아닌지 검사)

public class NotAllowNumCheck extends Check {
	
	private int notAllowNum;

	public NotAllowNumCheck(String name, int notAllowNum) {
		super(name);
		this.notAllowNum = notAllowNum;
	}

	@Override
	protected boolean isValid(int num) {
		return num != notAllowNum;
	}
}

 

OddCheck : 책임 클래스3 (홀수인지 검사)

public class OddCheck extends Check {

	public OddCheck(String name) {
		super(name);
	}

	@Override
	protected boolean isValid(int num) {
		return num % 2 == 1;
	}
}

 

Main: 테스트 클래스

 

public class Main {
	public static void main(String[] args) {
		Check limit20 = new LimitCheck("limit20", 20);
		Check odd = new OddCheck("odd");
		Check notAllow11 = new NotAllowNumCheck("notAllow11", 11);
		
		odd.setNext(limit20).setNext(notAllow11); // 책임을 연결하는 부분
		
		for (int i=1;i<=23;i++) {
			odd.validCheck(i);
		}
	}
}

 

 

 

2. 특징

처리를 요청하는 부분과 처리를 수행하는 부분이 분리되어 있다.

- 책임을 연결하는 부분을 동적으로 처리할 수 있다.

    - 책임 떠넘기기를 조건문으로 처리한 경우에서는 동적 처리가 힘들다.

 

3. 해당 패턴을 고려해볼만한 상황

- 순차적으로 조건을 확인하는 로직이 필요하고 그 로직이 동적으로 달라질 가능성이 있을 때

'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글

Mediator 패턴  (0) 2021.02.14
Facade 패턴  (0) 2021.02.12
Visitor 패턴  (0) 2021.02.07
Decorator 패턴  (0) 2021.01.30
Composite 패턴  (0) 2021.01.24