定义
桥接模式(Bridge Pattern) 是指将抽象部分与它的实现部分分离,使它们都可以独立的变化。
例如:
我们要实现一个对象,用来序列化数据,将数据序列化到磁盘上可能有多重方式,json 格式, XML 格式或者database 等。使用桥接模式,将具体的序列化实现部分分离开来,使得抽象和实现的部分可以独立的变化,增强了代码的扩展性。
类图
一个典型的桥接模式的类图如下所示:
代码示例
BridgePattern.h
#pragma once
class Implementor
{
public:
virtual void OperationImplemention() = 0;
};
class Abstraction
{
public:
Abstraction(Implementor* pImp);
virtual ~Abstraction();
public:
virtual void Operation() = 0;
protected:
Implementor* GetImplementor() { return m_pImplementor; }
private:
Implementor* m_pImplementor;
};
class CRefinedAbstraction : public Abstraction
{
public:
CRefinedAbstraction(Implementor* pImp);
virtual ~CRefinedAbstraction();
virtual void Operation();
};
class CConcreateImplementorA : public Implementor
{
public:
virtual void OperationImplemention();
};
class CConcreateImplementorB : public Implementor
{
public:
virtual void OperationImplemention();
};
BridgePattern.cpp
#include "BridgePattern.h"
#include <iostream>
//--------- Abstraction ---------------
Abstraction::Abstraction(Implementor* pImp) : m_pImplementor(pImp)
{
}
Abstraction::~Abstraction()
{
if (m_pImplementor)
{
delete m_pImplementor;
m_pImplementor = 0;
}
}
//---------- CRefeinedAbstraction ----------------
CRefinedAbstraction::CRefinedAbstraction(Implementor* pImp)
: Abstraction(pImp)
{
}
CRefinedAbstraction::~CRefinedAbstraction()
{
}
void CRefinedAbstraction::Operation()
{
if (GetImplementor())
{
GetImplementor()->OperationImplemention();
}
}
//------------- CConcreateImplementor ----------
void CConcreateImplementorA::OperationImplemention()
{
std::cout << "CConcreateImplementorA operation ! " << std::endl;
}
void CConcreateImplementorB::OperationImplemention()
{
std::cout << "CConcreateImplementorB operation ! " << std::endl;
}
Client
<span style="white-space:pre"> </span>{
Abstraction* pAbstraction = new CRefinedAbstraction(new CConcreateImplementorA());
pAbstraction->Operation();
}
{
Abstraction* pAbstraction = new CRefinedAbstraction(new CConcreateImplementorB());
pAbstraction->Operation();
}