์ฑ ์ ์ฐ์ ํจํด (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) ์ฒด์ธ์ด ์ข
๋ฃ๋ฉ๋๋ค.
์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ํตํด ์๋ก์ด ์ฒ๋ฆฌ์๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ผ๋ฉฐ, ์ฒ๋ฆฌ ๋ก์ง์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.