Search

์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด

์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด (Chain of Responsibility Pattern)

์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ฒด์ธ์„ ๋”ฐ๋ผ ์š”์ฒญ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉฐ, ๊ฐ ๊ฐ์ฒด๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์š”์ฒญ์˜ ๋ฐœ์‹ ์ž์™€ ์ˆ˜์‹ ์ž๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ชฉ์ 

โ€ข
์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฐ์ฒด์™€ ๋ฐ›๋Š” ๊ฐ์ฒด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค
โ€ข
์š”์ฒญ์˜ ์ฒ˜๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
โ€ข
์ฑ…์ž„์˜ ๋ถ„์‚ฐ๊ณผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์ค€์ˆ˜

ํŠน์ง•

โ€ข
์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ์—ฐ์‡„์ ์œผ๋กœ ์ „๋‹ฌ๋จ
โ€ข
๊ฐ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋‹ค์Œ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง
โ€ข
ํด๋ผ์ด์–ธํŠธ๋Š” ์ฒด์ธ์˜ ์‹œ์ž‘์ ๋งŒ ์•Œ๋ฉด ๋จ
โ€ข
์ƒˆ๋กœ์šด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€/์ œ๊ฑฐ ๊ฐ€๋Šฅ

์˜ˆ์‹œ ์ฝ”๋“œ

abstract class Handler { protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } public abstract void handleRequest(Request request); } class ConcreteHandler1 extends Handler { public void handleRequest(Request request) { if (/* can handle request */) { // handle request } else if (successor != null) { successor.handleRequest(request); } } } class ConcreteHandler2 extends Handler { public void handleRequest(Request request) { if (/* can handle request */) { // handle request } else if (successor != null) { successor.handleRequest(request); } } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ ์„ค๋ช…

์œ„์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:
โ€ข
Handler (์ถ”์ƒ ํด๋ž˜์Šค): ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ๋‹ค์Œ ์ฒ˜๋ฆฌ์ž(successor)์™€์˜ ์—ฐ๊ฒฐ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
setSuccessor(): ๋‹ค์Œ ์ฒ˜๋ฆฌ์ž๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ, ์ฒด์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€ข
handleRequest(): ์‹ค์ œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.
๊ตฌ์ฒด์ ์ธ ์ฒ˜๋ฆฌ์ž ํด๋ž˜์Šค๋“ค(ConcreteHandler1, ConcreteHandler2)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:
โ€ข
์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์ฒ˜๋ฆฌ์ž(successor)์—๊ฒŒ ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๋‹ค์Œ ์ฒ˜๋ฆฌ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ(successor == null) ์ฒด์ธ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ฒ˜๋ฆฌ์ž๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.