본문 바로가기

언어/JAVA

Adapter Pattern

@Adapter Pattern

한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다.

어댑터패턴을 이용하면, 인터페이스 호환성 문제로 같이 쓸 수 없는 클래스를 연결해서 쓸 수 있다. 

 

어댑터 패턴 클래스 다이어그램

어댑터 패턴을 설명할 때 가장 유명한 예제가 있다.

바로 오리와 칠면조를 예를 든 예제인데 이거만큼 많이 나오고 이해하기쉬운게 없는 거 같다.

 

Duck.interface

public interface Duck { 
	public void quack(); 
	public void fly();
}

MallardDuck.java

public class MallardDuck implements Duck { 
    @Override public void quack() { 
    System.out.println("Quack"); 
    } 
    @Override public void fly() {
    System.out.println("I'm flying"); 
    } 
}

Turkey.interface

public interface Turkey { 
public void gobble(); 
public void fly(); 
}

WildTurkey.java

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"); 
    } 
}

Duck 인터페이스를 구현한 MallardDuck클래스와 Turkey인터페이스를 구현한 WildTurkey클래스가 있다.

만약 Duck객체가 모자라서 Turkey객체를 대신 사용해야하는 상황이 생겼다고 가정하자.

이 둘은 인터페이스가 다르기 때문에 Turkey객체를 바로 사용할 수 없다.

이제 어댑터를 만들어보자.

 

TurkeyAdapter.java

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(); 
    } 
   
}

 

DuckTestDrive

public class DuckTestDrive { 
    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(); 
	} 
}

TurkeyAdapter 생성자에 매개변수로 turkey를 넣어주고 Duck 인터페이스의 오버라이드된 메소드에 turkey의 메소드를 넣어주자. 그럼 TurkeyAdaper의 인터페이스로 Duck을 구현해서 Duck의 메소드로 turkey의 메소드를 사용할 수 있다.

 

어댑터패턴을 공부하면서 느낀점은 실무에서 상당히 자주 사용된다는 것이다.

어댑터 패턴은 기존 클래스의 소스코드를 수정해서 인터페이스에 맞추는 작업보다는 기존 클래스의 소스코드의 수정을 전혀하지않고도 타겟 인터페이스에 맞춰서 동작을 가능하게 한다.(유지보수가 원할하게 된다.)

 

참고

https://thefif19wlsvy.tistory.com/43

'언어 > JAVA' 카테고리의 다른 글

정적 멤버 클래스 vs 비정적 멤버 클래스  (0) 2022.02.07
strategy pattern  (0) 2022.01.22
[UML]클래스 다이어그램  (0) 2022.01.19
다이아몬드 상속 문제(다중상속의 문제점)  (0) 2022.01.19
디자인패턴  (0) 2022.01.15