#pragma once

#ifndef BRIDEG_H

#define BRIDEG_H

class Implementor;

// 维护一个Implementor 类的指针
class Abstraction
{
public:
Abstraction(Implementor* pImplementor);
virtual ~Abstraction();
void Operation();

protected:
Implementor* m_pImplementor;
};

// 为实现Abstraction 定义的抽象基类,定义了实现的接口函数
class Implementor
{
public:
Implementor(){}
virtual ~Implementor(){}
virtual void OperationImpl() = 0;
};

// 继承自Implementor,是Implementor 的不同实现之一
class ConcreateImplementorA : public Implementor
{
public:
ConcreateImplementorA(){}
virtual ~ConcreateImplementorA(){}
virtual void OperationImpl();
};

// 继承自Implementor,是Implementor 的不同实现之一
class ConcreateImplementorB : public Implementor
{
public:
ConcreateImplementorB(){}
virtual ~ConcreateImplementorB(){}
virtual void OperationImpl();
};

#endif


#include "StdAfx.h"
#include "bridge_impl.h"

#include "bridge_impl.h"

#include <iostream>

void ConcreateImplementorA::OperationImpl()
{
std::cout << "Implementation by ConcreateImplementorA\n";
}

void ConcreateImplementorB::OperationImpl()
{
std::cout << "Implementation by ConcreateImplementorB\n";
}

Abstraction::Abstraction(Implementor* pImplementor)
: m_pImplementor(pImplementor)
{
}

Abstraction::~Abstraction()
{
delete m_pImplementor;
m_pImplementor = NULL;
}

void Abstraction::Operation()
{
m_pImplementor->OperationImpl();
}


// Bridge.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include "bridge_impl.h"
#include <stdlib.h>
#include <stdio.h>

//将抽象部分与它的实现部分分离,使它们都可以独立地变化

int _tmain(int argc, _TCHAR* argv[])
{
/************************************************************************/
/* media_link::create_link(link_type) (提供抽象接口)--> */
/* --> media_link_impl::create_link(new tcp,new udp,new rtsp) (传入不同对象指针)*/
/* --> tcp_link_impl::create_link,udp_link_impl::create_link,--- */
/* --- rtsp_link_impl::create_link (不同具体实现) */
/************************************************************************/

ConcreateImplementorA *pImplA = new ConcreateImplementorA();
Abstraction *pAbstraction1 = new Abstraction(pImplA);
pAbstraction1->Operation();
delete pAbstraction1;

ConcreateImplementorB *pImplB = new ConcreateImplementorB();
Abstraction *pAbstraction2 = new Abstraction(pImplB);
pAbstraction2->Operation();
delete pAbstraction2;

system("pause");

return 0;
}