어댑터 패턴

특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환,

인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줌

 


객체 어댑터
객체 어댑터 클래스 어댑터 (다중 상속)

 

객체 어댑터 - 구성(Composition) 으로 어댑티에 요청 전달

클래스 어댑터 - 타깃과 어댑티 모두 서브클래스로 만들어 사용

 

 

소프트웨어 시스템에 새소운 업체에서 제공한 클래스 라이브러리 를 사용해야하는데, 그 업체에서 사용하는 인터페이스가 기존에 사용하던 인터페이스와 다를 때

기존 시스템의 코드와 업체에서 제공한 클래스도 변경이 불가능한 상황이다.

 

이 때, 새로운 업체에서 사용하는 인터페이스를 기존에 사용하던 인터페이스에 적응시켜주는 클래스를 만든다.

어댑터는 클라이언트로부터 요청을 받아 새로운 업체에서 제공하는 클래스를 클라이언트가 받아들일 수 있는 형태의 요청으로 변환해 주는 중개인 역활을 해준다.

 

 

예제)

기존에 총이 사용하던 총알이 다음과 같이 3개가 있다.

 

이번 업데이트로 총 에서 레이저가 나갈 수 있도록 업데이트를 하려고 한다.

하지만 기존에 설계된 레이저는 Bullet을 상속받지 못하도록 되어있다.

그래서 다음과 같이 어댑터를 적용하면 총에서 레이저를 쏠 수 있다.

 

#include <iostream>
#include <memory>

using namespace std;

// ------- Exist Bullet ----------
class Bullet {
public:
    virtual void Damage() = 0;
};

class NormalBullet : public Bullet {
public:
    void Damage() override {
        cout << "탕" << endl;
    }
};

class FireBullet : public Bullet {
public:
    void Damage() override {
        cout << "화르륵" << endl;
    }
};

class IceBullet : public Bullet {
public:
    void Damage() override {
        cout << "꽁꽁" << endl;
    }
};
// -----------------------------

// -------- new Lazer ----------
class Lazer {
public:
    void OnLazer() {
        cout << "지이이잉" << endl;
    }
};

class LazerAdaptor : public Bullet {
public:
    void Damage() override {
        lazer->OnLazer();
    }

private:
    shared_ptr<Lazer> lazer;
};
// -----------------------------

class Gun {
public:
    void Shot() {
        bullet->Damage();
    }

    void SetBullet(shared_ptr<Bullet> _bullet) {
        bullet = _bullet;
    }

private:
    shared_ptr<Bullet> bullet;
};


int main() {
    unique_ptr<Gun> gun = make_unique<Gun>();

    unique_ptr<NormalBullet> normalBullet = make_unique<NormalBullet>();
    unique_ptr<FireBullet> fireBullet = make_unique<FireBullet>();
    unique_ptr<IceBullet> iceBullet = make_unique<IceBullet>();


    gun->SetBullet(move(normalBullet));
    gun->Shot();

    gun->SetBullet(move(fireBullet));
    gun->Shot();

    gun->SetBullet(move(iceBullet));
    gun->Shot();

    unique_ptr<LazerAdaptor> lazerAdaptor = make_unique<LazerAdaptor>();
    gun->SetBullet(move(lazerAdaptor));
    gun->Shot();
}

+ Recent posts