[Design Pattern] 어댑터 패턴Study/CS2024. 4. 2. 21:49
Table of Contents
어댑터 패턴
- 용도 : 클래스를 바로 사용할 수 없는 경우가 있는데 중간에서 변환 역할을 해주는 클래스가 필요할 때 사용한다.
- (예 : 다른 곳에서 개발했다거나, 수정할 수 없을 경우)
- 사용 방법 : 상속
- 호환되지 않은 인터페이스를 사용하는 클라이언트 그대로 활용 가능
- 향후에 인터페이스가 바뀌더라도, 변경 내역은 어댑터에 캡슐화 되므로 클라이언트가 바뀔 필요가 없다.
클래스 다이어그램
아이폰의 이어폰을 생각해보자.
이어폰 잭을 아이폰에 사용하려면 아이폰 특성상 잭이 맞지 않아 들어가지 않는다.
혹은 해외에 여행 가면 종종 110V를 사용할 때처럼 우리가 어댑터를 따로 구매해야 한다.
이처럼 어댑터는 필요로 하는 인터페이스로 바꿔주는 역할을 한다.
이처럼 업체에서 제공한 클래스가 기존 시스템에 맞지 않는다면?
기존 시스템을 수정하는 것이 아닌 어댑터를 활용해 유연하게 해결해보자.
코드로 어댑터 패턴 이해하기
오리와 칠면조 인터페이스 생성
만약 오리 객체가 부족해서 칠면조 객체를 대신 사용해야 한다면
두 객체는 인터페이스가 다르므로 바로 칠면조 객체를 사용하는 것은 불가능하다
따라서 칠면조 어댑터를 생성해서 활용해야 한다.
Duck.java
package AdapterPattern;
public interface Duck{
public void quack();
public void fly();
}
Turkey.java
package AdapterPattern;
public interface Turkey{
public void gobble();
public void fly();
}
WildTurkey.java
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");
}
}
TurkeyAdapter.java
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();
}
}
DuckTest.java
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 say...");
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();
}
}
아까 확인한 클래스 다이어그램에서 Target은 오리에 해당하며, Adapter는 칠면조라고 생각하면 된다.
'Study > CS' 카테고리의 다른 글
[Algorithm] 선택 정렬(Selection Sort) (0) | 2024.04.09 |
---|---|
[Algorithm] 거품 정렬 (Bubble Sort) (0) | 2024.04.04 |
[WEB] 브라우저 동작 방법 (0) | 2024.03.28 |
[Design Pattern] 디자인 패턴 개요 (0) | 2024.03.27 |
[Database] Key (0) | 2024.03.26 |
@chumminggg :: Log_Double 7