1、定义
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
2、介绍
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。
3、源码
类关系图:
具体思路:1、IProduct类与CNewCorp类作为具体产品类与公司类桥,CNewCorp类有成员IProduct类。2、建立具体产品类对象与公司类对象,构造公司类对象为有参构造,产品做为构造参数。3、调用公司类的对象方法,实际调用父类的方法,父类根据IProduct指针的指向,确定具体调用的方法。
3.1、头文件
IProduct.h
#pragma once
class IProduct
{
public:
IProduct(void)
{
}
virtual ~IProduct(void)
{
}
virtual void BeProducted() = 0;
virtual void BeSelled() = 0;
};
House.h
#pragma once
#include "iproduct.h"
class CHouse :
public IProduct
{
public:
CHouse(void);
~CHouse(void);
void BeProducted();
void BeSelled();
};
Clothes.h
#pragma once
#include "iproduct.h"
class CClothes :
public IProduct
{
public:
CClothes(void);
~CClothes(void);
void BeProducted();
void BeSelled();
};
IPod.h
#pragma once
#include "iproduct.h"
class CIPod :
public IProduct
{
public:
CIPod(void);
~CIPod(void);
void BeProducted();
void BeSelled();
};
NewCorp.h
#pragma once
#include "IProduct.h"
class CNewCorp
{
public:
CNewCorp(IProduct *pproduct);
virtual ~CNewCorp(void);
void MakeMoney();
private:
IProduct *m_pProduct;
};
NewHouseCorp.h
#pragma once
#include "newcorp.h"
#include "House.h"
class CNewHouseCorp :
public CNewCorp
{
public:
CNewHouseCorp(CHouse *pHouse);
~CNewHouseCorp(void);
void MakeMoney();
};
ShanZhaiCorp.h
#pragma once
#include "newcorp.h"
#include "IProduct.h"
class CShanZhaiCorp :
public CNewCorp
{
public:
CShanZhaiCorp(IProduct *pproduct);
~CShanZhaiCorp(void);
void MakeMoney();
};
3.2、实现
House.cpp
#include "House.h"
CHouse::CHouse(void)
{
}
CHouse::~CHouse(void)
{
}
void CHouse::BeProducted()
{
cout << "生产出的房子是这个样子的..." << endl;
}
void CHouse::BeSelled()
{
cout << "生产出的房子卖出去了..." << endl;
}
Clothes.cpp
#include "Clothes.h"
CClothes::CClothes(void)
{
}
CClothes::~CClothes(void)
{
}
void CClothes::BeProducted()
{
cout << "生产出的衣服是这个样子的..." << endl;
}
void CClothes::BeSelled()
{
cout << "生产出的衣服卖出去了..." << endl;
}
IPod.cpp
#include "IPod.h"
CIPod::CIPod(void)
{
}
CIPod::~CIPod(void)
{
}
void CIPod::BeProducted()
{
cout << "生产出的ipod是这个样子的..." << endl;
}
void CIPod::BeSelled()
{
cout << "生产出的ipod卖出去了..." << endl;
}
NewCorp.cpp
#include "NewCorp.h"
CNewCorp::CNewCorp( IProduct *pproduct )
{
this->m_pProduct = pproduct;
}
CNewCorp::~CNewCorp(void)
{
}
void CNewCorp::MakeMoney()
{
//每个公司都是一样,先生产
this->m_pProduct->BeProducted();
//然后销售
this->m_pProduct->BeSelled();
}
NewHouseCorp.cpp
#include "NewHouseCorp.h"
CNewHouseCorp::CNewHouseCorp(CHouse *pHouse) : CNewCorp(pHouse)
{
}
CNewHouseCorp::~CNewHouseCorp(void)
{
}
void CNewHouseCorp::MakeMoney()
{
this->CNewCorp::MakeMoney();
cout << "房地产公司赚大钱了..." << endl;
}
ShanZhaiCorp.cpp
#include "ShanZhaiCorp.h"
CShanZhaiCorp::CShanZhaiCorp(IProduct *pproduct) : CNewCorp(pproduct)
{
}
CShanZhaiCorp::~CShanZhaiCorp(void)
{
}
void CShanZhaiCorp::MakeMoney()
{
this->CNewCorp::MakeMoney();
cout << "我赚钱呀..." << endl;
}
Bridge.cpp
#include "ClothesCorp.h"
#include "NewHouseCorp.h"
#include "Clothes.h"
#include "IPod.h"
#include "ShanZhaiCorp.h"
#include <iostream>
using std::cout;
using std::endl;
void DoNewRun1()
{
cout << "----------房地产公司是这样运行的----------" << endl;
CHouse house;
CNewHouseCorp newHouseCorp(&house);
newHouseCorp.MakeMoney();
cout << endl;
cout << "----------山寨公司是这样运行的----------" << endl;
CClothes clothes;
CShanZhaiCorp shanZhaiCorp(&clothes);
shanZhaiCorp.MakeMoney();
cout << endl;
}
void DoNewRun2()
{
cout << "----------房地产公司是这样运行的----------" << endl;
CHouse house;
CNewHouseCorp newHouseCorp(&house);
newHouseCorp.MakeMoney();
cout << endl;
cout << "----------山寨公司是这样运行的----------" << endl;
CIPod ipod;
CShanZhaiCorp shanZhaiCorp(&ipod);
shanZhaiCorp.MakeMoney();
cout << endl;
}
int main()
{
//只有两家公司,一家是房地产公司,另一家公司是衣服赚钱就生产衣服
DoNewRun1();
//只有两家公司,一家是房地产公司,另一家公司是ipod赚钱就生产ipod
DoNewRun2();
system("pause");
return 0;
}
4、运行结果
参考文献:《菜鸟教程》 https://blog.csdn.net/phiall/article/details/52199659博客