현대자동차와 테슬라가 함께 협업한다고 생각해보자. 현대자동차에서 개발한 기능을 테슬라와 비교하며 운용해야 하는 상황인데, 현대자동차의 객체가 테슬라의 객체와 스펙이 달라서 개발을 둘러갈 상황에 처해 있다. 이 때 수월한 개발을 위해 인터페이스를 통일하면 좋을텐데… 좋은 방법이 없을까?
위와 같은 상황에서 채택해볼만한 것이 Adapter 패턴이다.
public interface HyundaiCar {
public void rideLikeFly();
}
Java
복사
public interface TeslaCar {
public void rideLikeWalk();
}
Java
복사
위와 같은 인터페이스에서 두 메서드는 서로 같은 역할이라고 했을 때, 아래와 같이 엮어내는 것이 가능하다.
public class TeslaCarAdapter implements HyundaiCar {
private final TeslaCar teslaCar;
public TeslaCarAdapter(TeslaCar teslaCar) {
this.teslaCar = teslaCar;
}
@Override
public void rideLikeFly() {
teslaCar.rideLikeWalk();
}
}
Java
복사
public DriveReport testDrive(HyundaiCar hyndaiCar) {
// ...
hyndaiCar.rideLikeFly();
// ...
}
Java
복사
이를 실제로 위와 같이 운용하는 상황이라고 한다면, 아래 코드처럼 Adapter를 사용할 수 있다.
public void testScenario(HyundaiCar source, TeslaCar target) {
HyundaiCar adapter = new TeslaCarAdapter(target);
DriveReport sourceReport = testDrive(source);
DriveReport adapterReport = testDrive(adapter);
// ...
}
Java
복사