티스토리 뷰
반응형
역할 사슬 패턴 (Chain Of Responsibility)
여러 개의 객체 중에서 어떤 것이 요구를 처리할 수 있는지를 사전에 알 수 없을 때 사용됩니다. 즉 요청 처리가 들어오게 되면 그것을 수신하는 객체가 자신이 처리 할 수 없는 경우에는 다음 객체에게 문제를 넘김으로써 최종적으로 요청을 처리 할 수 있는 객체의 의해 처리가 가능하도록 하는 패턴입니다.
구조 (Structure)
● Handler : 요청을 처리하기 위한 수신자들이 가져야 할 인터페이스를 정의
● ConcreteHandler : Handler 인터페이스 구현, 각자가 요청 종류에 따라 자신이 처리 할 수 있는 부분을 구현
● Client : 맨 처음 수신자에게 처리를 요구함
예제
예제는 역할 사슬 패턴을 사용하여 1~20까지의 반복문을 수행하면서 각각의 수가 홀수인지 짝수인지를 판단하는 프로그램을 구현합니다.
Receiver.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 |
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 |
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 입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
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);
}
}
}
|
메인 영역에서 테스트를 하는 단계입니다.
반응형
'Study > 디자인 패턴' 카테고리의 다른 글
12 방문자 패턴 (Visitor Pattern) (0) | 2017.10.11 |
---|---|
11 컴포지트 패턴 (Composite Pattern) (0) | 2017.09.30 |
09 퍼사드 패턴 (Facade Pattern) (0) | 2017.09.26 |
08 반복자 패턴 (Iterator Pattern) (0) | 2017.09.24 |
07 브릿지 패턴 (Bridge Pattern) (0) | 2017.09.22 |