티스토리 뷰

Java/Design Patterns

어댑터 패턴 (Adapter Pattern)

snail voyager 2023. 4. 27. 00:40
728x90
반응형
한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환
어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 사용 가능
  • 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용 가능
  • 클라이언트와 구현된 인터페이스를 분리
  • 인터페이스가 바뀌더라도 변경 내역은 어댑터에서 캡슐화되기 때문에 클라이언트는 바뀔 필요 없음

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

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

public class WildTurkey implements Turkey{
    @Override
    public void gobble() {
        System.out.println("Gobble Gobble");
    }

    @Override
    public void fly() {
        System.out.println("flying a short distance");
    }
}

public class TurkeyAdapter implements Duck{     //Target 인터페이스를 구현
    Turkey turkey;  //Adaptee, 객체 구성 사용

    public TurkeyAdapter (Turkey turkey) {
        this.turkey = turkey;
    }

    @Override
    public void quack() {
        turkey.gobble();
    }

    @Override
    public void fly() {
        turkey.fly();
    }
}

public class DuckTestDrive {
    public static void main(String[] args) {
        MallardDuck duck = new MallardDuck();

        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey); //Adapter

        turkey.gobble();
        turkey.fly();

        testDuck(duck);
        testDuck(turkeyAdapter);    //Duck 대신 Turkey로 처리 가능
    }

    static void testDuck(Duck duck) {   //Duck 객체를 받아서 처리하는 메소드
        duck.quack();
        duck.fly();
    }
}
728x90
반응형
반응형
300x250