반응형
Adapter Pattern (적응자 패턴)
목적
기존의 라이브러리나 프레임워크 또는 프로젝트 내에서 공통적으로 사용하여 코드 수정이 쉽지 않은 class등을 수정하지 않고
내가 원하는 기능을 추가할 수 있도록 변환(adapt) 시킨다.
https://gist.github.com/dwpark1112/a164d1cdc4d1c771b0972080f616394c
사용 시나리오
1. 시스템에서 블루투스, WIFI를 키고 끌수 있는 프레임워크를 제공한다.
2. 개발하는 앱에서 블루투스,WIFI를 키고 끄는 기능을 제공하며 킬 때, 끌 때 로그를 저장하는 기능을 제공한다.
[Adaptee]
블루투스,WIFI 프레임워크가 adaptee가 된다. 활성화와 비활성화 기능을 제공한다.
class BluetoothFW { public: static void ActivateBT() { cout<<"BT Activated"<<endl; } static void DeactivateBT() { cout<<"BT Deactivated"<<endl; } };
[Target interface]
블루투스,WIFI를 키고 끄는 기능의 인터페이스를 정의한다.
class NetWorkController { public: virtual void Activate() = 0; virtual void Deactivate() = 0; };
[Adapter]
Adaptee에서 제공하는 메소드를 활용하여 요구사항(로그저장)에 맞게 적응시킨다.
class BluetoothController : public NetWorkController { public: virtual void Activate() { cout<<"Save Log Activate BT"<<endl; BluetoothFW::ActivateBT(); } virtual void Deactivate() { cout<<"Save Log Deactivate BT"<<endl; BluetoothFW::DeactivateBT(); } }; class WIFIController : public NetWorkController { public: virtual void Activate() { cout<<"Save Log Activate WIFI"<<endl; WIFIFW::ActivateWIFI(); } virtual void Deactivate() { cout<<"Save Log Deactivate WIFI"<<endl; WIFIFW::DeactivateWIFI(); } };
[사용 예]
int main(int argc, const char * argv[]) { NetWorkController * controller = new BluetoothController(); controller->Activate(); controller->Deactivate(); delete controller; controller = new WIFIController(); controller->Activate(); controller->Deactivate(); return 0; }
반응형
'Design Patterns > Structural Patterns' 카테고리의 다른 글
Facade Pattern (C++) (0) | 2019.10.27 |
---|---|
Bridge Pattern (C++) (0) | 2019.10.13 |
Decorator Pattern (C++) (0) | 2019.07.21 |
Composite Pattern (C++) (0) | 2019.04.21 |
Structural Pattern (구조패턴) (0) | 2019.03.03 |