适用情境:当继承不能完全分离抽象部分和实现部分时,选择桥接模式来符合"开放-封闭原则".
// classa.h
#ifndef CLASSA_H
#define CLASSA_H
#include "classb.h"
class ClassA
{
public:
ClassA();
virtual void Run() = 0;
void SetClassB(ClassB* classB);
protected:
ClassB *m_classb;
};
#endif // CLASSA_H
// classa.cpp
#include "classa.h"
ClassA::ClassA(){}
void ClassA::SetClassB(ClassB *classB)
{
m_classb = classB;
}
// classb.h
#ifndef CLASSB_H
#define CLASSB_H
class ClassB
{
public:
ClassB();
virtual void Run() = 0;
};
#endif // CLASSB_H
// classb.cpp
#include "classb.h"
ClassB::ClassB(){}
// concreteclassba.h
#ifndef CONCRETECLASSBA_H
#define CONCRETECLASSBA_H
#include "classb.h"
class ConcreteClassBA : public ClassB
{
public:
ConcreteClassBA();
virtual void Run();
};
#endif // CONCRETECLASSBA_H
// concreteclassba.cpp
#include "concreteclassba.h"
#include <iostream>
ConcreteClassBA::ConcreteClassBA(){}
void ConcreteClassBA::Run()
{
std::cout << "concrete classb a run()" << std::endl;
}
// concreteclassaa.h
#ifndef CONCRETECLASSAA_H
#define CONCRETECLASSAA_H
#include "classa.h"
class ConcreteClassAA : public ClassA
{
public:
ConcreteClassAA();
virtual void Run();
};
#endif // CONCRETECLASSAA_H
// concreteclassaa.cpp
#include "concreteclassaa.h"
ConcreteClassAA::ConcreteClassAA(){}
void ConcreteClassAA::Run()
{
m_classb->Run();
}
客户端:
// main.cpp
#include <iostream>
#include "classa.h"
#include "classb.h"
#include "concreteclassaa.h"
#include "concreteclassba.h"
using namespace std;
int main(int argc, char *argv[])
{
ClassA* pClassA = new ConcreteClassAA();
ClassB* pClassB = new ConcreteClassBA();
pClassA->SetClassB(pClassB);
pClassA->Run();
return 0;
}