Adapter Pattern
Adapter Pattern ์ ๋ฆฌ
์ํฉ
Adapter Pattern์ด๋?
์ด๋ํฐ๋ ํธํ๋์ง ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ค์ด ํ์ ํ ์ ์๋๋ก ํ๋ ๊ตฌ์กฐ์ ๋์์ธย ํจํด์ด๋ค.
๊ฐ์ฅ ํํ๊ฒ ์ฌ์ฉํ๋ ์์๋ก, ์๊ตญ ์ฝ์ผํธ๋ ์ฐ๋ฆฌ๋๋ผ ์ฝ์ธํธ์ ๋ค๋ฅด๋ค. ๊ทธ๋ ๊ธฐ์, ๋ง์ฝ ์ถฉ์ ๊ธฐ๋ฅผ ์ฝ์ผํธ์ ๊ฝ์ผ๋ ค๊ณ ํ๋ฉด ๋ค์ด๊ฐ์ง ์๋๋ค. ์ด๋ฅผ ์ํด Adapter๊ฐ ์กด์ฌํ๋ค. Adapter๋ฅผ ํตํด ์ฝ์ผํธ > Adapter > ์ถฉ์ ๊ธฐ๋ฅผ ์ฐ๊ฒฐํ์ฌ ๊ธฐ์กด ์ฝ์ผํธ์ ์ถฉ์ ๊ธฐ๋ฅผ ๋ณํํ์ง ์๊ณ ๋ ์ฐ๊ฒฐ๊ฐ๋ฅํ๋ค.
ํด๋์ค Apdater์ Object Adapter์ด ์์ง๋ง, ๋ค์ค ์์์ด ์๋๋ Java์์๋ ์ธํฐํ์ด์ค์ ๊ฐ์ฒด ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ Adapter ํจํด๋ง ์ฌ์ฉํ ์ ์๋ค.
[Object Adapter]
[Class Adapter]
์ฝ๋ ์์
Object Adapter
๊ธฐ์กด์ Duck ์ธํฐํ์ด์ค๋ฅผ ํตํด์๋ Turkey(์น ๋ฉด์กฐ)๋ฅผ ๋ค๋ฃจ๊ณ ์ถ์ ๋ ์๋์ ๊ฐ์ด Adapter ํจํด์ ์ฌ์ฉํ๋ค.
Adapter ํด๋์ค์์๋ ๊ฐ๊ฐ Duck์ ๋ง๋ ํจ์๋ฅผ ์ฐ๊ฒฐํด์ค๋ค.
1
2
3
4
public interface Turkey {
public void gobble();
public void fly();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
public void quack() {
turkey.gobble();
}
public void fly() {
for(int i=0; i < 5; i++) {
turkey.fly();
}
}
}
[ํ ์คํธ ์ฝ๋]
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
public class DuckTestDrive {
public static void main(String[] args) {
Duck duck = new MallardDuck();
Turkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("The Turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\nThe Duck says...");
testDuck(duck);
System.out.println("\nThe TurkeyAdapter says...");
testDuck(turkeyAdapter);
// Challenge
Drone drone = new SuperDrone();
Duck droneAdapter = new DroneAdapter(drone);
testDuck(droneAdapter);
}
static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}
Class adapter
ํ์ง๋ง, ์๋์ ๋ฐฉ๋ฒ์ Java์์ ๊ถ์ฅํ์ง ์๋๋ค.
1
2
3
4
5
6
7
8
public class extends Turkey implementes Duck {
public void quack() {
gobble();
}
public void fly() {
fly();
}
}
๋น๊ต(๊ฐ์ฒด ์ด๋ํฐ vs ํด๋์ค ์ด๋ํฐ)
- ๊ฐ์ฒด ์ด๋ํฐ๋ ์ด๋ํฐ์ ์๋ธ ํด๋์ค์ ๋ํด์๋ ์ด๋ํฐ ์ญํ ์ ํ ์ ์๋ค.
- ํด๋์ค ์ด๋ํฐ๋ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง, ์ค์ ์ฌ์ฉํ๋ ์ฝ๋๋ง ์์ฑํ ์ ์๋ค.
๋ค์ค์์์ ๊ถ์ฅํ์ง ์๋ Java์์๋ ๊ฐ์ฒด ์ด๋ํฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
๋ฐ์ฝ๋ ์ดํฐ vs ์ด๋ํฐ ํจํด
๋๋ค ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ผ๋ค๋ ๊ฒ์์ ๋์ผํ๋ค. ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ Component ํด๋์ค๋ฅผ ๊ตฌ์ฑ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ธฐ์กด์ ํด๋์ค๋ฅผ ์ง์์ ์ผ๋ก ๊ฐ์ธ, ํ๋์ ์์ํ๋ค. ์ด๋ํฐ ํจํด์ ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ฉฐ, ์ธํฐํ์ด์ค๋ฅผ ๋ณํํ๋ค. (Type Change) ์ธํฐํ์ด์ค๋ฅผ ๋ณํํ๋ค๋ ์ฐจ์ด์ ๊ณผ ๋๋ถ์ด ์ด๋ํฐ๋ ๋จ์ ๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐ๋ฉด ๋ฐ์ฝ๋ ์ดํฐ๋ ํ๋๊ณผ ์ฑ ์์ ์์ํ๋ค.