10 역할 사슬 패턴 (Chain Of Responsibility)

2021. 12. 13. 14:21 JAVA/Design Patterns

역할 사슬 패턴 (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