[Design Pattern] 어뎁터 패턴

Adapter Pattern

어뎁터 패턴이란 클래스의 인터페이스를 사용자가 기대하는 인터페이스로 변환하는 패턴이다. 서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 동작시키며 래퍼라고도 한다.

활용성

  1. 기존 클래스를 사용하고 싶은데 인터페이스가 맞지 않을 때
  2. 이미 만든 클래스나 인터페이스를 재사용하고자 하나 이 재사용 가능한 라이브러리를 수정할 수 없을 때

어뎁터 패턴 사용에 따른 결과

Class Adapter Pattern

  1. Adapter 클래스는 Adaptee 클래스를 상속하기 때문에 Adaptee에 정의된 행동을 재정의할 수 있다.
  2. 한 개의 Adapter만 사용하며 Adaptee로 가기 위한 추가적인 포인터 간접 참조는 필요하지 않다

Object Adapter Pattern

  1. Adapter 클래스가 수많은 Adaptee 클래스와 함께 동작할 수 있다. 즉, Adaptee와 Adaptee 서브 클래스들을 효과적으로 사용할 수 있다.

어뎁터

구조

클래스 어뎁더의 구조는 다음과 같다.

Class Adapter Pattern Diagram

오브젝트 어뎁터의 구조는 다음과 같다.

Object Adapter Pattern Diagram

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()
{
//Object Adapter Pattern
SmartPhone* iPhone = new IPhone();
iPhone->videoCall();
}

void AdapterPattern::getElectronicDevice()
{
//Class Adapter Pattern
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");
}
}
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/15/Design%20Pattern/AdapterPattern/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.