[디자인 패턴] 어댑터(Adapter) 패턴
Java/디자인 패턴(Design Pattern)

[디자인 패턴] 어댑터(Adapter) 패턴

반응형

어댑터 패턴


  • 용도 : 클래스를 바로 사용할 수 없는 경우가 있음 (다른 곳에서 개발했다거나, 수정할 수 없을 때) 중간에서 변환 역할을 해주는 클래스가 필요 → 어댑터 패턴
  • 사용 방법 : 상속
  • 호환되지 않은 인터페이스를 사용하는 클라이언트 그대로 활용 가능
  • 향후 인터페이스가 바뀌더라도, 변경 내역은 어댑터에 캡슐화 되므로 클라이언트 바뀔 필요X

 

 

클래스 다이어그램

 


 

아이폰의 이어폰을 생각해보자

가장 흔한 이어폰 잭을 아이폰에 사용하려면, 잭 자체가 맞지 않는다.

따라서 우리는 어댑터를 따로 구매해서 연결해야 이런 이어폰들을 사용할 수 있다

 

이처럼 어댑터는 필요로 하는 인터페이스로 바꿔주는 역할을 한다

 


이처럼 업체에서 제공한 클래스가 기존 시스템에 맞지 않으면?

기존 시스템을 수정할 것이 아니라, 어댑터를 활용해 유연하게 해결하자

 

 

코드로 어댑터 패턴 이해하기

오리와 칠면조 인터페이스 생성

만약 오리 객체가 부족해서 칠면조 객체를 대신 사용해야 한다면?

두 객체는 인터페이스가 다르므로, 바로 칠면조 객체를 사용하는 것은 불가능함

따라서 칠면조 어댑터를 생성해서 활용해야 한다

Duck.java

1
2
3
4
5
6
package AdapterPattern;
 
public interface Duck {
    public void quack();
    public void fly();
}
cs


Turkey.java

1
2
3
4
5
6
package AdapterPattern;
 
public interface Turkey {
    public void gobble();
    public void fly();
}
cs


WildTurkey.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package AdapterPattern;
 
public class WildTurkey implements Turkey {
 
    @Override
    public void gobble() {
        System.out.println("Gobble gobble");
    }
 
    @Override
    public void fly() {
        System.out.println("I'm flying a short distance");
    }
}
cs


TurkeyAdapter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package AdapterPattern;
 
public class TurkeyAdapter implements Duck {
 
    Turkey turkey;
 
    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }
 
    @Override
    public void quack() {
        turkey.gobble();
    }
 
    @Override
    public void fly() {
        turkey.fly();
    }
 
}
 
cs


DuckTest.java

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
package AdapterPattern;
 
public class DuckTest {
 
    public static void main(String[] args) {
 
        MallardDuck duck = new MallardDuck();
        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey);
 
        System.out.println("The turkey says...");
        turkey.gobble();
        turkey.fly();
 
        System.out.println("The Duck says...");
        testDuck(duck);
 
        System.out.println("The TurkeyAdapter says...");
        testDuck(turkeyAdapter);
 
    }
 
    public static void testDuck(Duck duck) {
 
        duck.quack();
        duck.fly();
 
    }
}
cs


아까 확인한 클래스 다이어그램에서 Target은 오리에 해당하며, Adaptee는 칠면조라고 생각하면 된다.


참고 : 헤드 퍼스트 디자인 패턴




반응형