Adapter Pattern
어뎁터 패턴이란 클래스의 인터페이스를 사용자가 기대하는 인터페이스로 변환하는 패턴이다. 서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 동작시키며 래퍼라고도 한다.
활용성
- 기존 클래스를 사용하고 싶은데 인터페이스가 맞지 않을 때
- 이미 만든 클래스나 인터페이스를 재사용하고자 하나 이 재사용 가능한 라이브러리를 수정할 수 없을 때
어뎁터 패턴 사용에 따른 결과
Class Adapter Pattern
- Adapter 클래스는 Adaptee 클래스를 상속하기 때문에 Adaptee에 정의된 행동을 재정의할 수 있다.
- 한 개의 Adapter만 사용하며 Adaptee로 가기 위한 추가적인 포인터 간접 참조는 필요하지 않다
Object Adapter Pattern
- Adapter 클래스가 수많은 Adaptee 클래스와 함께 동작할 수 있다. 즉, Adaptee와 Adaptee 서브 클래스들을 효과적으로 사용할 수 있다.
어뎁터
구조
클래스 어뎁더의 구조는 다음과 같다.
오브젝트 어뎁터의 구조는 다음과 같다.
C++ 구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void AdapterPattern::AdapterPattern() { getIPhoneAdapter(); getElectronicDevice(); }
void AdapterPattern::getIPhoneAdapter() { SmartPhone* iPhone = new IPhone(); iPhone->videoCall(); }
void AdapterPattern::getElectronicDevice() { ElectronicDevice* electronicDevice = new ElectronicDevice(); electronicDevice->videoCall(); electronicDevice->shoot(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class ElectronicDevice : public SmartPhone, Camera { public: ElectronicDevice() { std::cout<<"Electronic Device Constructed"<<std::endl; }
void videoCall() override { std::cout<<"Electronic Device can call to someone"<<std::endl; }
void shoot() override { std::cout<<"Electronic Device can shoot photo also"<<std::endl; } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class SmartPhone { public: virtual ~SmartPhone() {}; virtual void videoCall() = 0; };
class IPhone : public SmartPhone { Camera* camera; public: IPhone() { std::cout<<"IPhone Constructed"<<std::endl; camera = new SonyCamera(); }
~IPhone() override {};
void videoCall() override { std::cout<<"IPhone Calling"<<std::endl; camera->shoot(); } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Camera { public: virtual ~Camera() {}; virtual void shoot() = 0; };
class SonyCamera : public Camera { public: SonyCamera() { std::cout<<"SonyCamera Constructed"<<std::endl; } ~SonyCamera() override {}; void shoot() override { std::cout<<"SonyCamera Running"<<std::endl; } };
|
java 구현
1 2 3 4 5 6 7 8 9 10
| public class Client { public static void main(String[] args) { SmartPhone smartPhone = new IPhone(); smartPhone.videoCall();
ElectronicDevice electronicDevice = new ElectronicDevice(); electronicDevice.videoCall(); electronicDevice.shoot(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public interface SmartPhone { void videoCall(); }
public class IPhone implements SmartPhone{ private Camera camera;
public IPhone() { camera = new SonyCamera(); }
@Override public void videoCall() { System.out.println("IPhone Calling"); camera.shoot(); } }
|
1 2 3 4 5 6 7 8 9 10
| public interface Camera { void shoot(); }
public class SonyCamera implements Camera{ @Override public void shoot() { System.out.println("SonyCamera Running"); } }
|
1 2 3 4 5 6 7 8 9 10 11
| public class ElectronicDevice implements SmartPhone, Camera{ @Override public void videoCall() { System.out.println("Electronic Device can call to someone"); }
@Override public void shoot() { System.out.println("Electronic Device can shoot photo also"); } }
|