#include <iostream>
using namespace std;
// Bridge 패턴: 인터페이스와 구현을 분리한다.
// 모든 MP3 player의 인터페이스
struct MP3PlayImp
{
       virtual void Play() = 0;
       virtual void Stop() = 0;
};
// 결국 인터페이스와 구현을 분리하는 개념.
// 사용자는 play와 stop만 가져다 쓰면 되고
// 제공자는 class만 제공하면 되도록 해야 한다.!!!
// 실제 GUI기능을 갖춘 MP3 Player 클래스
class MP3Play
{
       MP3PlayImp* pImp;
public:
       void Play()
       {
             // 위임(Delegate)라고 한다. - 구현물을 쉽게 바꿀수 있다.
             // PIMP 라는 개념.
             PImp->Play();
       }
       void Stop()
       {
             PImp->Stop();
       }
};
void main()
{
       // MP3 사용자
       MP3Play p;
       p.Play();
       p.Stop();
}
//////////////////////////////////////////////////////////
// linked list를 만들고 싶다. 값을 추가하는 함수를 만들고 싶다.
// 함수 이름을 무엇으로 할까?
// 실제 list의 구현물( 구현의 클래스 )
class real_list
{
public:
       void real_push_front( int a ) { }
       void real_push_back( int a ) { }
};
// 내부구현이다른list
class real_list2
{
public:
       void real_push_front( int a )
       {
             //전혀 다른 기법을 사용한다.
       }
       void real_push_back( int a )
       {
             //전혀 다른 기법을 사용한다.
       }
};
// 인터페이스 클래스
class list
{
       real_list* st;
public:
       void push_front( int a ) { st->real_push_front(a); }
       void push_back( int a )  { st->real_push_back(a); }
};
