STUDY/Design Pattern

책임 연쇄 패턴(Chain of Responsibility Pattern)

디리릭 2022. 12. 28. 21:49
728x90

책임 연쇄 패턴은 특정 작업을 여러 객체들이 연쇄적으로 처리하는 패턴이다.

요청을 초리할 수 있는 객체를 찾을 때 까지 집합 안에서 요청을 전달한다.

요청의 발신자와 수신자를 분리하거나 요청을 처리할 수 있는 객체가 여러개일 때 그 중 하나에 요청을 보내려는 경우 책임 연쇄 패턴을 적용하면 된다.

이 패턴을 사용함으로써 결합도를 낮출 수 있고 발신자와 수신자를 분리시킬 수 있다.

그치만 이 패턴은 디버깅 및 테스트가 쉽지 않다는 점이 있다.

구조

▷ Handler: 요청을 수신하고 처리 객체들의 집합에 전달하는 인터페이스이다.

▷ ConcreteHandler : 요청을 처리하는 실제 처리 객체

구현

 public interface IHandler
    {
        void setNext(IHandler next);
        void process(Number request);
    }
    
    ===========================================
    
     public class Number
    {
        private int number;
        public Number(int num)
        {
            this.number = num;
        }
        public int getNumber() 
        {
            return number;
        }
    }
    
    ===========================================
    
public class NegativeProcessor : IHandler
    {
        private IHandler nextChain;

        public void setNext(IHandler next)
        {
            this.nextChain = next;
        }
        public void process(Number request)
        {
            if (request.getNumber() < 0)
            {
                Console.WriteLine($"NegativeProcessor : {request.getNumber()}");
            }
            else 
            {
                nextChain.process(request);
            }
        }

    }
    
    ===========================================
    
     public class ZeroProcessor : IHandler
    {
        private IHandler nextChain;

        public void setNext(IHandler next)
        {
            this.nextChain = next;
        }
        public void process(Number request)
        {
            if (request.getNumber() == 0)
            {
                Console.WriteLine($"ZeroProcessor : {request.getNumber()}");
            }
            else
            {
                nextChain.process(request);
            }
        }

    }
    
    ===========================================
    
     public class PositiveProcessor : IHandler
    {
        private IHandler nextChain;

        public void setNext(IHandler next)
        {
            this.nextChain = next;
        }
        public void process(Number request)
        {
            if (request.getNumber() > 0)
            {
                Console.WriteLine($"PositiceProcessor : {request.getNumber()}");
            }
            else
            {
                nextChain.process(request);
            }
        }

    }
    
    ===========================================
    
    static void Main(string[] args)
        {

            IHandler c1 = new NegativeProcessor();
            IHandler c2 = new ZeroProcessor();
            IHandler c3 = new PositiveProcessor();

            c1.setNext(c2);
            c2.setNext(c3);

            c1.process(new Number(90));
            c1.process(new Number(-50));
            c1.process(new Number(0));
            c1.process(new Number(91));

            Console.Read();
        }

RESULT >>>>

집합을 조금 다르게 반복적으로 사용할 때 유용

728x90

'STUDY > Design Pattern' 카테고리의 다른 글

해석자 패턴(Interpreter pattern)  (0) 2022.12.28
명령패턴 (Command Pattern)  (0) 2022.12.28
프록시 패턴(Proxy Pattern)  (0) 2022.12.19
경량 패턴(Flyweight Pattern)  (0) 2022.12.19
옵저버 패턴(Observer Pattern)  (0) 2022.12.19