โ๏ธ Java Design-Pattern XV - Chain of Responsibility
โ๏ธ Java Design-Pattern XV - Chain of Responsibility
๐
ใJAVA ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธ ํจํด : ์ฝ๊ฒ ๋ฐฐ์ฐ๋ GoF์ 23๊ฐ์ง ๋์์ธ ํจํดใ
๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Chain of Responsibility
ํจํด์ด๋?
- ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฒ๋ผ ์ฐ์์ ์ผ๋ก ๋ฌถ๊ณ , ๊ฐ์ฒด ์ฌ์ฌ์ ์ฐจ๋ก๋๋ก ๋๋ฉด์ ์ํ๋ ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ ํ๋ ํจํด์ด๋ค.
- ์ฆ, ์ด๋ค ๊ฐ์ฒด์๊ฒ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉด ์ฒ๋ฆฌํ๊ณ , ์ฒ๋ฆฌํ ์ ์์ ๋๋ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋๊ธด๋ค.
์์ ํ๋ก๊ทธ๋จ
- ํธ๋ฌ๋ธ์ด ๋ฐ์ํ์ ๋ ๋๊ตฐ๊ฐ๊ฐ ํด๊ฒฐํด์ผ ํ๋ ์ํฉ์ ๋ค์ ์์ ํ๋ก๊ทธ๋จ์์ ํ์ธํ ์ ์๋ค.
Trouble
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Trouble {
private int number;
public Trouble(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
@Override
public String toString() {
return "[Trouble " + number + "]";
}
}
- ๋ฐ์ํ ํธ๋ฌ๋ธ์ ํํํ๋ ํด๋์ค์ด๋ค.
Support
ย ํด๋์ค
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
public abstract class Support {
private String name;
private Support next;
public Support(String name) {
this.name = name;
this.next = null;
}
public Support setNext(Support next) {
this.next = next;
return next;
}
public void support(Trouble trouble) {
if (resolve(trouble)) {
done(trouble);
} else if (next != null) {
next.support(trouble);
} else {
fail(trouble);
}
}
@Override
public String toString() {
return "[" + name + "]";
}
protected abstract boolean resolve(Trouble trouble);
protected void done(Trouble trouble) {
System.out.println(trouble + " is resolved by " + this + ".");
}
protected void fail(Trouble trouble) {
System.out.println(trouble + " cannot be resolved.");
}
}
- ๋ฌธ์ ํด๊ฒฐ ์ฌ์ฌ์ ๋ง๋ค๊ธฐ ์ํ ์ถ์ ํด๋์ค์ด๋ค.
resolve
ย ๋ฉ์๋๋ ํ์ ํด๋์ค์์ ๊ตฌํํด์ผ ํ๋ ์ถ์ ๋ฉ์๋์ด๋ค.
NoSupport
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
public class NoSupport extends Support {
public NoSupport(String name) {
super(name);
}
@Override
protected boolean resolve(Trouble trouble) {
return false;
}
}
Support
ย ํด๋์ค์ ํ์ ํด๋์ค๋ก,ยresolve
ย ๋ฉ์๋๋ ํญ์ยfalse
๋ฅผ ๋ฐํํ์ฌ ์ด๋ค ๋ฌธ์ ๋ ํด๊ฒฐํ์ง ์๋ ํด๋์ค์ด๋ค.
LimitSupport
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class LimitSupport extends Support {
private int limit;
public LimitSupport(String name, int limit) {
super(name);
this.limit = limit;
}
@Override
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() < limit) {
return true;
} else {
return false;
}
}
}
Support
ย ํด๋์ค์ ํ์ ํด๋์ค๋ก,ยlimit
ย ๋ฏธ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํด๋์ค์ด๋ค.- ๋ณธ ์์ ํ๋ก๊ทธ๋จ์ย
resolve
ย ๋ฉ์๋์์ยtrue
๋ฅผ ๋ฐํํ ๋ฟ์ด์ง๋ง, ์ค์ ๋ก๋ ์ด๊ณณ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์ด์ผ ํ๋ค.
OddSupport
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class OddSupport extends Support {
public OddSupport(String name) {
super(name);
}
@Override
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() % 2 == 1) {
return true;
} else {
return false;
}
}
}
Support
ย ํด๋์ค์ ํ์ ํด๋์ค๋ก, ํ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
SpecialSupport
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SpecialSupport extends Support {
private int number;
public SpecialSupport(String name, int number) {
super(name);
this.number = number;
}
@Override
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() == number) {
return true;
} else {
return false;
}
}
}
Support
ย ํด๋์ค์ ํ์ ํด๋์ค๋ก ์ง์ ๋ ๋ฒํธ์ ํ ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํด๋์ค์ด๋ค.
Main
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Main {
public static void main(String[] args) {
Support alice = new NoSupport("Alice");
Support bob = new LimitSupport("Bob", 100);
Support charlie = new SpecialSupport("Charlie", 429);
Support diana = new LimitSupport("Diana", 200);
Support elmo = new OddSupport("Elmo");
Support fred = new LimitSupport("Fred", 300);
}
alice
.setNext(bob)
.setNext(charle)
.setNext(diana)
.setNext(elmo)
.setNext(fred)
for (int i = 0; i < 500; i += 33) {
alice.support(new Trouble(i));
}
}
- ๋น์ฐํ๊ฒ๋ ์คํ ๊ฒฐ๊ณผ์ย
Alice
๋ ์ถ๋ ฅ๋์ง ์๋๋ค. - ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋ ๋๊ธฐ๊ธฐ ๋๋ฌธ์ด๋ค.
Chain of Responsibility
ย ํจํด์ ๋ฑ์ฅ์ธ๋ฌผ
Support
ย ํด๋์ค
- ์๊ตฌ๋ฅผ ์ฒ๋ฆฌํ๋ ์ธํฐํ์ด์คย
API
๋ฅผ ์ ์ํ๋ ์ฒ๋ฆฌ์ยHandler
ย ์ญํ ์ ํ๋ค.
NoSupport
,ย LimitSupport
,ย OddSupport
,ย SpecialSupport
ย ํด๋์ค
- ์๊ตฌ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์ย
ConcreteHandler
ย ์ญํ ์ ํ๋ค.
Main
ย ํด๋์ค
- ์ฒซ ๋ฒ์งธ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์์๊ฒ ์๊ตฌ๋ฅผ ํ๋ ์๊ตฌ์ย
Client
ย ์ญํ ์ ํ๋ค.
์ฑ ์์ ์ ์ํ๋ ํํธ
์๊ตฌ์์ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์๋ฅผ ์ ์ฐํ๊ฒ ์ฐ๊ฒฐํ๋ค.
- ์๊ตฌ์๊ฐ ์ฒซ ๋ฒ์งธ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์์๊ฒ ์๊ตฌ๋ง ํ๋ฉด, ๋๋จธ์ง๋ ๊ทธ ์๊ตฌ๊ฐ ๋ฌธ์ ํด๊ฒฐ ์ฌ์ฌ์ ํ๋ฌ๋ค๋๋ค๊ฐ ์ ์ ํ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์์๊ฒ ์ฒ๋ฆฌ๋๋ค.
- ๋ง์ฝ ์ด ํจํด์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด โ์ด ์๊ตฌ๋ ์ด ์ฌ๋์ด ์ฒ๋ฆฌํด์ผ ํ๋คโ๋ ์ ๋ณด๋ฅผ ๋๊ตฐ๊ฐ๊ฐ ์ค์์ง๊ถ์ ์ผ๋ก ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
- ๋ํ ๊ทธ๋ฐ ์ ๋ณด๋ฅผ ์๊ตฌํ๋ ์ฌ๋์ด ๊ฐ๊ณ ์๋ ๊ฒ์ ๋ถํ์ผ๋ก์์ ๋ ๋ฆฝ์ฑ์ด ํผ์๋๊ธฐ ๋๋ฌธ์ ์ ์ ์น ์๋ค.
๋์ ์ผ๋ก ์ฌ์ฌ ํํ๋ฅผ ๋ฐ๊พผ๋ค.
- ์์ ํ๋ก๊ทธ๋จ์์๋ ์ง์ํ์ ํญ์ ๊ณ ์ ๋ ์์๋๋ก ๋์ด ์๋ค.
- ๊ทธ๋ฌ๋ ์๊ตฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์ ์ญํ ๊ฐ์ฒด์ ๊ด๊ณ๊ฐ ๋์ ์ผ๋ก ๋ณํํ๋ ์ํฉ๋ ์๊ฐํ ์ ์๋ค.
GUI
ย ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ์ฉ์๊ฐ ์ฑ ํ๋ฉด์์ ์ปดํฌ๋ํธ๋ฅผ ์์ ๋กญ๊ฒ ์ถ๊ฐํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์ด ๋ ํด๋น ํจํด์ด ํจ๊ณผ์ ์ผ๋ก ์๋ํ๋ค.
์๊ธฐ ์ผ์ ์ง์คํ ์ ์๋ค.
- ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์ ์ญํ ์ ์์ ์ด ํ ์ ์๋ ์ผ์ ์ง์คํ๊ณ , ์ด์ธ์ ์ผ์ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ ์๋ ์ฝ๋๋ฅผ ์์ ์ด ์๊ณ ๊ฐ ํ์๊ฐ ์์ด์ง๋ค.
- ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชป ํ ๊ฒฝ์ฐ, ๊ทธ์ ๋ค๋ฅธ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์์๊ฒ ๋ฌธ์ ๋ฅผ ๋๊ธฐ๋ฉด ๋๋ค.
- ํด๋น ํจํด์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ๊ด๋ฆฌ์ ํ ๋ช ์ด ๋๊ฐ ์๊ตฌ๋ฅผ ์ฒ๋ฆฌํ ์ง ๋ชจ๋ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ทจํ๋ค.
- ํน์ โA๊ฐ ์๋๋ฉด B์๊ฒ, ๊ทธ๋๋ ์๋๋ฉด C์๊ฒโ ์ด๋ฐ ์์ผ๋ก ์ผ์ ํ ๋น๊น์ง ๊ฐ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์ ์ญํ ์ ๋ถ๋ด์ํค๋ ๋ฐฉ๋ฒ์ ์ทจํ๊ฒ ๋๋ค.
๋ ๋๊ธฐ๊ธฐ๋ก ์ฒ๋ฆฌ๊ฐ ์ง์ฐ๋์ง ์์๊น?
- ์ค์ ๋ก ํด๋น ํจํด์ ์ฌ์ฉํ๋ฉด ๋๊ฐ ์๊ตฌ๋ฅผ ์ฒ๋ฆฌํ ์ง ์ ํด์ ธ ์๋ ํ๋ก๊ทธ๋จ๊ณผ ๋น๊ตํ๋ฉด ์ฒ๋ฆฌ๊ฐ ์ง์ฐ๋๋ ๊ฒ์ด ๋ง๋ค.
- ํ์ง๋ง ์ด๊ฒ์ ๋ฌด์์ ์ฐ์ ์ผ๋ก ํ ์ง ํธ๋ ์ด๋์คํ ๋ฌธ์ ์ด๋ค.
- ์๊ตฌ์ ์ฒ๋ฆฌ์์ ๊ด๊ณ๊ฐ ๊ณ ์ ์ ์ด๊ณ ์ฒ๋ฆฌ์๋๊ฐ ๋งค์ฐ ์ค์ํ ๊ฒฝ์ฐ์๋ ํด๋น ํจํด์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ํจ๊ณผ์ ์ผ ์ ์๋ค.
This post is licensed under CC BY 4.0 by the author.