[디자인패턴] Adapter 패턴
[Design Pattern] Adapter 패턴
한국에서 쓰는 가전 기기를 110V를 쓰는 나라에 가져가면 쓸 수가 없다. 왜냐면 우리나라는 220V로 규격화 되어 있기 때문이다. 110V를 쓰는 나라에서 우리나라 가전기기를 사용하려면 뭐가 필요 할까? 바로 아답터다. 220V 가전기기를 110V에서 사용하기 위해 꼭 필요하다. 프로그램에서도 마찮가지 이다. 이미 구현 되어 있는 Util Class가 존재 한다. 내가 만든 프로그램에서 해당 클래스를 사용하는데 알맞는 인터페이스가 존재 하지 않을 때가 있다. 이때 아덥터 패턴을 사용해 이미 구현된 Class를 사용해 보자.
상속을 사용한 Adapter 패턴
나는 내비게이션을 가지고 있다. 이것을 새 차에 장착하고 싶은데 붙일 방법이 없다. 그래서 거치대를 사서 붙였다.
이 상황을 프로그램 해보겠다.
[가전 제품과 예제 비교]
예제 프로그램 |
가전 제품 비유 |
Car |
한국에서 쓰는 가전 제품 |
거치대(Adapter) |
아뎁터 (Adapter) |
내비게이션 |
V110 |
[클래스 다이어그램]
[전체 예제]
[차에서 내비를 실행] public class Main { public static void main(String[] args) { Car carHasNavi = new Adapter();
carHasNavi.powerOnNavi(); carHasNavi.powerOffNavi(); } } =========================================================================================== [차 에서 내비게이션을 동작 하고 싶다.] public interface Car { void powerOnNavi(); void powerOffNavi(); } =========================================================================================== [이미 존재 하는 내비게이션] public class Navigation {
public void onStart() { System.out.println("내비게이션 시작"); }
public void onDestory() { System.out.println("내비게이션 종료"); } } =========================================================================================== [거치대는 네비게이션과 차를 상속 받아 결국에 차에서 내비를 실행 할 수 있게 된다.] public class Adapter extends Navigation implements Car { @Override public void powerOnNavi() { onStart(); } @Override public void powerOffNavi() { onDestory(); } } |
위임을 사용한 Adapter 패턴
앞에서 보여줬던 예제와 비슷하지만 이전에는 상속을 통한 거치대를 구현 했다면 이번엔 위임을 통해 아뎁터 패턴을 알아보겠다.
[클래스 다이어그램]
[파일 쓰는 예제]
[차에서 내비를 실행] public class Main { public static void main(String[] args) { Car carHasNavi = new Adapter();
carHasNavi.powerOnNavi(); carHasNavi.powerOffNavi(); } } =========================================================================================== [차 에서 내비게이션을 동작 하고 싶다.] public abstract class Car { public abstract void powerOnNavi(); public abstract void powerOffNavi(); } =========================================================================================== [이미 존재 하는 내비게이션] public class Navigation {
public void onStart() { System.out.println("내비게이션 시작"); }
public void onDestory() { System.out.println("내비게이션 종료"); } } =========================================================================================== [거치대는 차를 상속 받아 내부적으로 내비를 생성해 실행하고 있다.] public class Adapter extends Car { private Navigation navi = new Navigation(); @Override public void powerOnNavi() { navi.onStart(); } @Override public void powerOffNavi() { navi.onDestory(); } } |