어댑터 패턴
- 서로 다른 인터페이스를 가진 두 클래스를 어댑터 클래스를 통해 인터페이스를 통일시켜 사용하는 디자인 패턴
구현
public abstract class Transportation {
protected String name;
public Transportation(String name) {
this.name = name;
}
public abstract void runnable();
}
- 운송 수단을 추상화한 추상 클래스
- runnable 메서드를 공통적으로 가진다
public class Bus extends Transportation{
public Bus(String name) {
super(name);
}
@Override
public void runnable() {
System.out.println(name + " running");
}
}
- Transportation 클래스를 상속받은 Bus 클래스
public class Airplane {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String flyable() {
return "flyable";
}
}
- Transportation 클래스와 호환되지 않는 Airplane 클래스
- 호환을 시키기 위해 어댑터 패턴 사용
public class Adapter extends Transportation{
private Airplane airplane;
public Adapter(String name) {
super(name);
airplane = new Airplane();
airplane.setName(name);
}
@Override
public void runnable() {
System.out.println(airplane.getName() + " " + airplane.flyable());
}
}
- Airplane 클래스가 Transportation 클래스와 호환되도록 하는 어댑터 클래스
- 어댑터를 통해 runnable 메서드 사용이 가능해진다.
사용 이유
- 이미 만들어진 코드를 재사용하는 경우 기존 코드가 수정이 불가한 경우
- 새로운 인터페이스가 호환되지 않는 경우
단점
- 각 제품 구현체마다 팩토리 객체를 모두 구현해주어야 하기 때문에 서브 클래스 수가 증가
- 추상 팩토리의 내부사항 변경 시 모든 팩토리에 대한 수정이 필요하다.
참고
어댑터(Adaptor) 패턴 - 완벽 마스터하기