10 역할 사슬 패턴 (Chain Of Responsibility)
역할 사슬 패턴 (Chain Of Responsibility)
구조 (Structure)
● Handler : 요청을 처리하기 위한 수신자들이 가져야 할 인터페이스를 정의
● ConcreteHandler : Handler 인터페이스 구현, 각자가 요청 종류에 따라 자신이 처리 할 수 있는 부분을 구현
● Client : 맨 처음 수신자에게 처리를 요구함
예제
예제는 역할 사슬 패턴을 사용하여 1~20까지의 반복문을 수행하면서 각각의 수가 홀수인지 짝수인지를 판단하는 프로그램을 구현합니다.
Receiver.java
public abstract class Receiver {
public String name; //리시버 이름
private Receiver next=null; //다음 수신 객체
public Receiver(String name)
{
this.name=name;
}
public Receiver setNext(Receiver next) //다음에 수신 할 객체 지정
{
this.next = next;
return next;
}
public final void support(int number) //처리
{
if(resolve(number)) //해당 수신 객체가 요청 처리를 하였는지 판단
{
done(number);
}
else if(next != null) //처리 요청을 못하였다면 다음 수신객체에게 처리요청
{
next.support(number);
}
else //사슬에 있는 어떠한 객체도 처리 못한 경우
{
System.out.println("어떤 객체도 처리하지 못함");
}
}
public abstract boolean resolve(int number);
public abstract void done(int number);
}
수신 객체가 가져야 할 공통인터페이스를 정의 및 구현 하는 Receiver 클래스입니다. 자신이 처리 못한 문제를 다음 객체에게 넘기기 위해서 자기 자신의 인스턴스를 가지는 형태입니다.
setNext()를 통해 다음에 처리 요청을 할 수신 객체를 지정하고 support()를 통해 처리 요청이 완료 여부에 따라 분기하고 있는 형태입니다.
Even_Receiver
public class Even_Receiver extends Receiver{
public Even_Receiver(String name)
{
super(name);
}
public boolean resolve(int number) //해당 숫자가 짝수일 경우 true 반환
{
if(number%2==0)
return true;
else
return false;
}
public void done(int number)
{
System.out.println(number +":" + name+"가 해결");
}
}
짝수에 대한 처리 요청을 완료 할 수 있는 Even_Receiver 입니다.
Odd_Receiver
public class Odd_Receiver extends Receiver {
public Odd_Receiver(String name)
{
super(name);
}
public boolean resolve(int number) //해당 숫자가 홀수일 경우 true 반환
{
if(number%2!=0)
return true;
else
return false;
}
public void done(int number)
{
System.out.println(number +":" + name+"가 해결");
}
}
홀수에 대한 처리 요청을 완료 할 수 있는 Odd_Receiver 입니다.
public class Main {
public static void main(String argsp[]) throws InterruptedException
{
Receiver odd_receiver = new Odd_Receiver("홀수 리시버");
Receiver even_receiver = new Even_Receiver("짝수 리시버");
odd_receiver.setNext(even_receiver); //수신기의 처리 요청 순서를 지정
for(int i=1;i<=20;i++)
{
odd_receiver.support(i);
}
}
}
메인 영역에서 테스트를 하는 단계입니다.
출처 : https://lktprogrammer.tistory.com/45?category=672216
'JAVA > Design Patterns' 카테고리의 다른 글
14 메멘토 패턴 (Memento Pattern) (0) | 2021.12.13 |
---|---|
13 데코레이터 패턴 (Decorator Pattern) (0) | 2021.12.13 |
12 방문자 패턴 (Visitor Pattern) (0) | 2021.12.13 |
11 컴포지트 패턴 (Composite Pattern) (0) | 2021.12.13 |
09 퍼사드 패턴 (Facade Pattern) (0) | 2021.12.13 |
08 반복자 패턴 (Iterator Pattern) (0) | 2021.12.13 |
07 브릿지 패턴 (Bridge Pattern) (0) | 2021.12.13 |
06 프록시 패턴 (Proxy Pattern) (0) | 2021.12.13 |