클래스를 바로 사용할 수 없는 경우가 있음(다른 곳에서 개발했다거나 수정할 수 없을 떄)
중간에서 변환 역할을 해주는 클래스가 필요 ➡️ 어댑터 패턴
➡️ 어댑터는 필요로 하는 인터페이스로 바꿔주는 역할을 함
오리와 칠면조 인터페이스 생성
만약 오리 객체가 부족해서 칠면조 객체를 대신 사용해야 한다면?
두 객체는 인터페이스가 다르므로, 바로 칠면조 객체를 사용하는 것은 불가능함
따라서 칠면조 어댑터를 생성해서 활용해야 한다
package AdapterPattern;
public interface Duck {
public void quack();
public void fly();
}
package AdapterPattern;
public interface Turkey {
public void gobble();
public void fly();
}
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");
}
}
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();
}
}
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();
}
}
기존 코드를 변경하지 않고 원하는 인터페이스 구현체를 만들어 재사용할 수 있다.
➡️ 기존 코드를 손상시키지 않는 것은 객체지향 원칙 중 개방/폐쇄 원칙에 해당
기존 코드가 하던 일과 특정 인터페이스 구현체로 변환하는 작업을 각기 다른 클래스로 분리하여 관리할 수 있다.
➡️ 역할에 맞게 코드를 분리하는 것은 객체지향 원칙 중 단일 책임 원칙에 해당
다수의 새로운 인터페이스와 클래스를 도입해야하므로 구조가 복잡해진다.
서비스 클래스를 변경하는 것이 간단할 때도 있다.
[참고 자료]