책임 연쇄 (Chain of Responsibility) 패턴 행동 패턴
요청에 대한 처리를 여러 객체를 통해 연쇄적으로 수행합니다.
처리를 요청으로부터 분리하기 위하여 클라이언트는 요청에 대해 처리할 수 있는 객체를 정의할 수 있다. 그런데, 요청에 대한 처리가 확장되기를 요구할 경우 이에 대한 구현도 추가될 수 밖에 없는데, if . . . else if . . . else 문을 통해 한 객체 안에 모든 처리를 우겨넣기엔 객체 지향 프로그래밍의 단일 책임 원칙을 위배한다.
그래서 책임 연쇄 (Chain of Responsibility) 패턴은 요청을 처리하는 객체를 책임에 따라 여러개로 나누고, 이들을 서로 연결하여 처리를 동적으로 수행한다. 객체가 요청을 받으면, 객체가 책임하는 처리를 수행한 다음에 연결된 객체로 요청을 재귀적으로 전달한다. 객체의 연결 구조는 단일 연결 리스트와 유사하다고 볼 수 있다.
책임 연쇄 패턴을 사용하여 요청을 처리할 경우, 요청을 받는 객체의 연결 구조에 따라 처리 결과가 달라지기에 요청에 대한 처리를 동적으로 확장할 수 있다. 그리고, 요청을 받는 객체들은 각각마다 단일의 책임을 부과할 수 있게 하여 책임에 대한 결합성을 완화하고, 책임을 유연하게 할당할 수 있다. 하지만, 책임 연쇄 패턴은 요청을 처리하는 데에 있어 신뢰성을 보장하지 않는다.
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | public class PatternChainOfResponsibility { public abstract class Handler { private Handler _next; public void SetNextHandler(Handler handler) { _next = handler; } public void HandleRequest<Receiver>() where Receiver : Handler { if (this is Receiver) { Operation(); } if (_next != null) { _next.HandleRequest<Receiver>(); } } public abstract void Operation(); } public class ReceiverA : Handler { public override void Operation() { Console.WriteLine("Operate ReceiverA"); } } public class ReceiverB : Handler { public override void Operation() { Console.WriteLine("Operate ReceiverB"); } } public class ReceiverC : Handler { public override void Operation() { Console.WriteLine("Operate ReceiverC"); } } public static void Main(string[] args) { Handler[] receivers = new Handler[] { new ReceiverA(), new ReceiverB(), new ReceiverC() }; for (int index = 0; index < receivers.Length - 1; index++) { receivers[index].SetNextHandler(receivers[index + 1]); } Handler handler = receivers[0]; handler.HandleRequest<ReceiverA>(); handler.HandleRequest<ReceiverB>(); handler.HandleRequest<ReceiverC>(); } } | cs |
1 2 3 4 | Operate ReceiverA Operate ReceiverB Operate ReceiverC Press any key to continue . . . | cs |
'PROGRAMMING > Design Pattern' 카테고리의 다른 글
[GoF] 명령 (Command) 패턴 (0) | 2019.03.09 |
---|---|
[GoF] 관찰자 (Observer) 패턴 (0) | 2019.03.09 |
[GoF] 메멘토 (Memento) 패턴 (0) | 2019.03.09 |
[GoF] 싱글턴 (Singleton) 패턴 (0) | 2019.03.09 |
[GoF] 프로토타입 (Prototype) 패턴 (0) | 2019.03.09 |