어댑터 패턴
특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환,
인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줌
![]() |
|
객체 어댑터 | 클래스 어댑터 (다중 상속) |
객체 어댑터 - 구성(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();
}
'디자인 패턴' 카테고리의 다른 글
템플릿 메소드 패턴 (Template Method pattern) (0) | 2023.05.06 |
---|---|
퍼사드 패턴 (Facade pattern) (0) | 2023.05.01 |
커맨드 패턴 (Command Pattern) (0) | 2023.04.23 |
싱글톤 패턴 (Singleton Pattern) (0) | 2023.04.16 |
데코레이터 패턴 (Decorator pattern) (0) | 2023.04.02 |