(C++ : Design-pattern) Bridge Pattern

Posted by : at

Category : Cpp   Design-pattern


Bridge Pattern

구현과 추상화 개념을 분리해서 각각을 독립적으로 변형할 수 있게한다.

역시 코드로 …

#include <iostream>
using namespace std;

struct IMP3
{
    virtual void Play() = 0;
    virtual void Stop() = 0;
    virtual ~IMP3() {}
}

class IPod
{
public:
    void Play() { cout << "Play MP3" << endl; }
    void Stop() { cout << "Stop MP3" << endl; }
};

class People
{
public:
    void UseMP3(IMP3* p)
    {
        p->Play();
        p->PlayOneMinute();     // 이 함수를 추가하고 싶다면?
    }
};

int main()
{

}
class MP3
{
    IMP3* pImpl;
public:
    MP3()
    {
        pImpl = new IPod;
    }
    void Play() { pImpl->Play(); }
    void Stop() { pImpl->Stop(); }
    void PlayOneMinute() {
        // 1분 후 종료
    }
};

class People
{
public:
    void UseMP3(MP3* p)
    {
        p->Play();
        p->PlayOneMinute();     // MP3에 이 함수를 만들면된다.
    }
};

PIMPL IDioms

// Point.h
class Point
{
    int x, y;
public:
    Point (int a = 0, int b = 0);
    void Print() const;
};
// Point.cpp
#include "Point.h"

Point::Point(int a, int b) : x(a), y(b) {}

void Point::Print() const
{
    cout << x << ", " << y << endl;
}
// main
#include "Point.h"

int main()
{
    Point p(1, 2);
    p.Print();
}

문제) #include "Point.h"는 수백 수천개에서 인클루드 한다면?
재컴파일하는데 엄청난 시간이 요구될 것이다. -> 개선해보자.

// PointImpl.h
class PointImpl
{
    int x, y;
public:
    PointImpl(int a = 0, int b = 0);
    void Print() const;
};
// PointImpl.cpp
PointImpl::PointImpl(int a, int b) : x(a), y(b) {}

void PointImpl::Print() const
{
    cout << x << ", " << y << endl;
}
// Point.h
class PointImpl;

class Point
{
    PointImpl* pImpl;
public:
    Point(int a= 0, int b = 0);
    void Print() const;
};
// Point.cpp

Point::Point(int a, int b)
{
    pImpl = new PointImpl(a, b);
}

void Point::Print() const
{
    pImpl->Print();
}

PointImpl에서 실제 동작을하고 수정을 해도 인클루드는 Point에서 하기에 디버깅에 영향을 주지 않는다. 이를 PIMPL(Pointer to IMPlementation)이라한다.

  • 컴파일 속도를 향싱
  • 완벽한 정보 은닉이 가능, 헤더파일을 감출수 있다.

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links