โ๏ธ Java Design-Pattern โ ฉ - Bridge
โ๏ธ Java Design-Pattern โ
ฉ - Bridge
๐
ใJAVA ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธ ํจํด : ์ฝ๊ฒ ๋ฐฐ์ฐ๋ GoF์ 23๊ฐ์ง ๋์์ธ ํจํดใ
๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Bridge
ํจํด์ด๋?
- ๊ธฐ๋ฅ์ ํด๋์ค ๊ณ์ธต๊ณผย ๊ตฌํ์ ํด๋์ค ๊ณ์ธตย ์ฌ์ด์์ ๋ค๋ฆฌ ์ญํ ์ ํ๋ ํจํด
๊ธฐ๋ฅ์ ํด๋์ค ๊ณ์ธต
- ์ด๋ค ํด๋์คย
Something
์ด ์๋ค๊ณ ํ ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์ถ์ ๋๋ ํ์ ํด๋์คยSomethingGood
๋ฅผ ๋ง๋ ๋ค. ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค๊ณ ํ ๋๋ยSomethingGoot
ย ํ์ ํด๋์ค๋กยSomethingBetter
ย ํด๋์ค๋ฅผ ๋ง๋ค๊ฒ ๋ ๊ฒ์ด๋ค. - ์ด๋ ๊ฒ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์ถ์ ๋ ํด๋์ค ๊ณ์ธต์์ ๋ชฉ์ ๊ณผ ๊ฐ๊น์ด ํด๋์ค๋ฅผ ์ฐพ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ํ์ ํด๋์ค๋ฅผ ๋ง๋๋๋ฐ, ์ด๋ฌํ ๊ณ์ธต์ ๊ธฐ๋ฅ์ ํด๋์ค ๊ณ์ธต์ด๋ผ๊ณ ํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ํด๋์ค ๊ณ์ธต์ ๋๋ฌด ๊น๊ฒ ํ์ง ์๋ ํธ์ด ์ข๋ค.
๊ตฌํ์ ํด๋์ค ๊ณ์ธต
- ์์ ํด๋์ค๋ฅผ ์ถ์ ๋ฉ์๋๋ก ์ธํฐํ์ด์คย
API
๋ฅผ ๊ท์ ํ๋ค. - ํ์ ํด๋์ค๋ฅผ ๊ตฌํ ๋ฉ์๋๋ก ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
- ์ด๋ฌํ ํด๋์ค ๊ณ์ธต์ ๊ตฌํ์ ํด๋์ค ๊ณ์ธต์ด๋ผ๊ณ ํ๋ค.
ํด๋์ค ๊ณ์ธต์ ํผ์ฌ์ ๋ถ๋ฆฌ
- ์ด์ฒ๋ผ ์ฐ๋ฆฌ๊ฐ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ๋๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๊ณ ํ๋์ง, ๊ตฌํํ๋ ค๊ณ ํ๋์ง ํ์ธํด์ผ ํ๋ค.
- ๋ ํด๋์ค ๊ณ์ธต์ด ํผ์ฌ๋์ด ์์ผ๋ฉด ๊ณ์ธต์ ๋ณต์กํ๊ฒ ๋ง๋ค์ด ์์ธก์ ์ด๋ ต๊ฒ ํ ์ ์๋ค.
- ๊ทธ๋์ ๋ ๊ณ์ธต์ ๋ ๋ฆฝ๋ ํด๋์ค ๊ณ์ธต์ผ๋ก ๋๋๋ค.
- ๋ค๋ง ๋ถ๋ฆฌ๋ง ํ๋ฉด ๊ทธ๋ฅ ํฉ์ด์ง๊ธฐ ๋๋ฌธ์ ๋ ํด๋์ค ๊ณ์ธต ์ฌ์ด์ ๋ค๋ฆฌ ํ๋๋ฅผ ๋์ด์ผ ํ๋ค.
- ๊ฐ์ฅ ์ฒ์ ์ธ๊ธํ๋ฏย
Bridge
ย ํจํด์ ๋ ๊ณ์ธต ์ฌ์ด์ ๋ค๋ฆฌ๋ฅผ ๋์์ฃผ๋ ์ญํ ์ ํ๋ค.
์์ ํ๋ก๊ทธ๋จ
- ๋ค์ ํ๋ก๊ทธ๋จ์ ๋ฌด์ธ๊ฐ๋ฅผ ํ์ํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ์ด๋ค.
Display
ย ํด๋์ค
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
public class Display {
private DisplayImpl impl;
public Display(DisplayImpl impl) {
this.impl = impl;
}
public void open() {
impl.rawOpen();
}
public void print() {
impl.rawPrint();
}
public void close() {
impl.rawClose();
}
public final void display() {
open();
print();
close();
}
}
impl
ย ํ๋๋ยDisplay
ย ํด๋์ค์ ๊ตฌํ์ ๋ํ๋ด๋ ํ๋์ด๋ค.ย- ์ด ํ๋๊ฐ ๋ ํด๋์ค ๊ณ์ธต์ ๋ค๋ฆฌ๊ฐ ๋๋ค.
open
,ยprint
,ยclose
ย ์ธ ๋ฉ์๋๋ยDisplay
ย ํด๋์ค์์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค์ด๋ค.ยopen
์ ํ์์ ์ ์ฒ๋ฆฌ์ด๋ค.ยprint
๋ ํ์ ๊ทธ ์์ฒด์ด๋ค.ยclose
๋ ํ์์ ํ์ฒ๋ฆฌ์ด๋ค.display
ย ๋ฉ์๋๋ยopen
,ยprint
,ยclose
๋ผ๋ยDisplay
์ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด โํ์ํ๋คโ๋ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค.
CountDisplay
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times) {
open();
for (int i = 0; i < times; i++) {
print();
}
close();
}
}
Display
ย ๊ธฐ๋ฅ์ ์ง์ ํ์๋งํผ ํ์ํ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌยCountDisplay
ย ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
DisplayImpl
ย ํด๋์ค
1
2
3
4
5
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
- ๊ตฌํ์ ํด๋์ค ๊ณ์ธต ์ต์์์ ์์นํ๋ ์ถ์ ํด๋์ค์ด๋ค.
- ํ์ ํด๋์ค๋ค์ด ์ด ์ถ์ ๋ฉ์๋๋ค์ ๊ตฌํํ๊ฒ ๋๋ค.
StringDisplayImpl
ย ํด๋์ค
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
public class StringDisplayImpl extends DisplayImpl {
private String string;
private int width;
public StringDisplayImpl(String string) {
this.string = string;
this.width = width;
}
@Override
public void rawOpen() {
printLine();
}
@Override
public void rawPrint() {
System.out.println("|" + string + "|");
}
@Override
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.print("+");
}
}
DisplayImpl
ย ํด๋์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ด๋ค.
Main
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, Korea."));
CountDisplay d2 = new Display(new StringDisplayImpl("Hello, World."));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe."));
d1.display();
d2.display();
d3.display();
d3.multiDisplay(5);
}
}
Bridge
ย ํจํด์ ๋ฑ์ฅ์ธ๋ฌผ
Display
ย ํด๋์ค
- ๊ธฐ๋ฅ์ ํด๋์ค ๊ณ์ธต์ ์ต์์ ํด๋์ค์ด๋ค.
- ์ถ์ํย
Abstraction
ย ์ถ์ํ ์ญํ ์ ๋งก์ ๊ตฌํ์ ์ญํ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ๋ง ๊ธฐ์ ๋ ํด๋์ค์ด๋ค.
CountDisplay
ย ํด๋์ค
- ๊ฐ์ ๋ ์ถ์ํย
RefinedAbstraction
ย ์ญํ ์ ๋งก์์ผ๋ฉฐ ์ถ์ํ ์ญํ ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค.
DisplayImpl
ย ํด๋์ค
- ๊ตฌํ์ ํด๋์ค ๊ณ์ธต์ ์ต์์ ํด๋์ค์ด๋ค.
- ๊ตฌํ์ย
Implementor
ย ์ญํ ์ ๋งก์ ์ถ์ํ ์ญํ ์ ์ธํฐํ์ด์คยAPI
๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ๊ท์ ํ๋ค.
StringDisplayImpl
ย ํด๋์ค
- ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ย
ConcreteImplementor
ย ์ญํ ์ ๋งก์ ๊ตฌํ์ ์ญํ ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๊ตฌํํ๋ค.
์ฑ ์์ ์ ์ํ๋ ํํธ
๋ถ๋ฆฌํด๋๋ฉด ํ์ฅ์ด ํธ๋ฆฌํด์ง๋ค.
Bridge
ย ํจํด์ ํน์ง์ ๊ฐ ํด๋์ค ๊ณ์ธต์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.- ๊ณ์ธต์ ๋ถ๋ฆฌํด ๋๋ฉด ์ถํ ๊ฐ๊ฐ์ ํด๋์ค ๊ณ์ธต์ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์๋ค.
- ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๋ฉด ๊ธฐ๋ฅ์ ํด๋์ค ๊ณ์ธต์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค.
- ์๋กญ๊ฒ ์ถ๊ฐํ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ตฌํ ๊ณ์ธต์์ ์ด์ฉํ ์ ์๊ฒ ๋๋ค.
์์์ ๊ฐํ ๊ฒฐํฉ์ด๊ณ ์์์ ์ฝํ ๊ฒฐํฉ์ด๋ค.
- ์์์ ํด๋์ค๋ฅผ ํ์ฅํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ด์ง๋ง, ํด๋์ค ๊ฐ์ ์ฐ๊ฒฐ์ ๊ฐํ๊ฒ ๊ณ ์ ์ํจ๋ค.
- ์ด ๊ด๊ณ๋ ์์ค ์ฝ๋๋ฅผ ์์ ํ์ง ์๋ ํ ๋ฐ๊ฟ ์ ์๋ค.
- ์์ ํ๋ก๊ทธ๋จ์์๋ ๋ค์๊ณผ ๊ฐ์ดย
Display
ย ํด๋์ค ์์์ ์์์ ์ฌ์ฉํ๋ค.
โopen์ ์คํํ ๋์๋ impl.rawOpen()์ ํธ์ถํ๋ค.โ
โprint์ ์คํํ ๋์๋ impl.rawPrint()์ ํธ์ถํ๋ค.โ
โclose์ ์คํํ ๋์๋ impl.rawClose()์ ํธ์ถํ๋ค.โ
Display
์ ๋ฉ์๋๋ฅผ ํธ์ถํ์๋๋ยimpl
์๊ฒ ๋ชจ๋ ๋ ๋๊ธด๋ค.- ์ด๊ฒ์ด ์์์ด๋ค.
Main
ย ํด๋์ค์์ยDisplay
์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ์์ฑ์์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์ญํ ์ ์ธ์คํด์ค๋ฅผ ์ธ์๋ก ๋๊ฒจ ์์กด์ฑ ์ฃผ์ ์ ํ๋ฉด ๋๋ค.- ์ ํํ ๋ ์์ ํ ๊ฒ์ย
Main
ย ํด๋์ค ๋ฟ์ด๊ณ ,ยDisplay
๋ยDisplayImpl
ย ๋ฑ์ ์์ ํ ํ์๊ฐ ์๋ค.
This post is licensed under CC BY 4.0 by the author.