객체지향

[객체지향] 디자인 패턴(4) - 어댑터 패턴

재담 2022. 5. 3. 00:17

어댑터 패턴

어댑터 패턴클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 동작하도록 해준다.

 

호환되지 않은 인터페이스를 사용하는 클라이언트 그대로 활용이 가능하고 향후 인터페이스가 변경되더라도 변경 내역은 어댑터에 캡슐화되므로 클라이언트는 바뀔 필요가 없다.

 

다음 코드를 보자.

public interface Duck {
    public void quack();
    public void fly();
}
public interface Turkey {
    public void gobble();
    public void fly();
}
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");
    }
    
}
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();
    }

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

위 코드에서 만약 오리 객체가 부족해서 칠면조 객체를 대신 사용해야 한다면, 두 객체는 인터페이스가 다르므로, 바로 칠면조 객체를 사용하는 것은 불가능하다. 따라서 칠면조 어댑터를 생성해서 활용해야 한다.


Reference