图片引用于百度
简介:将抽象部分与实现部分分离,使它们都可以独立的变化。
优点:各个对象之间都不会产生影响,无论是抽象变化还是实现变化,只需要对它扩展即可,高层代码无需任何更改就可以接收扩展后续的类
缺点:由于聚合关联关系建立在抽象层,开发者需要进行抽象设计与编程,会增加系统的理解与设计难度
例子背景:现有商家想上架到某平台卖货,而平台会有年费,我们用桥接模式实现它
桥接模式代码:
- 抽象商家类:
#pragma once
#include <string>
#include <iostream>
using namespace std;
class ElectricalShop
{
public:
virtual ~ElectricalShop() = default;
public:
virtual string GetShopName() = 0;
virtual string GetGoodsName() = 0;
virtual string GetGoodsIntroduction() = 0;
virtual double GetGoodsPrice() = 0;
virtual double GetAssets() = 0;
};
- 抽象平台类:
#pragma once
#include "Goods.h"
class ECommercePlatform
{
public:
ECommercePlatform() = default;
virtual ~ECommercePlatform() = default;
public:
virtual bool PutawayGoods(ElectricalShop* shop) = 0;
protected:
virtual bool CheckAnnualFee(ElectricalShop* shop) = 0;
virtual void ShowShop(ElectricalShop* shop) = 0;
virtual double GetPlatformForTheAnnualFee() = 0;
virtual string GetECName() = 0;
};
- 平台类:
#pragma once
#include "ECommercePlatform.h"
class MouBao : public ECommercePlatform
{
public:
MouBao() = default;
virtual ~MouBao() = default;
public:
virtual bool PutawayGoods(ElectricalShop* shop)
{
if (!CheckAnnualFee(shop)) return false;
ShowShop(shop);
return true;
}
protected:
virtual bool CheckAnnualFee(ElectricalShop* shop)
{
auto af = shop->GetAssets();
auto residue = af - GetPlatformForTheAnnualFee();
bool isPass = residue > 0;
string str(shop->GetShopName());
if (isPass)
{
str += "交完";
str += GetECName();
str += "平台年费后还剩:";
str += to_string(residue);
}
else
{
str += "资产不足以交";
str += GetECName();
str += "平台年费,上架失败";
}
cout << str << endl;
return isPass;
}
virtual void ShowShop(ElectricalShop* shop)
{
cout << MergeGoodsInfo(shop) << endl;
}
virtual double GetPlatformForTheAnnualFee()
{
return 45000;
}
virtual string MergeGoodsInfo(ElectricalShop* shop)
{
string str(shop->GetShopName());
str += "的";
str += shop->GetGoodsName();
str += "产品在";
str += GetECName();
str += "上架成功,售价为:";
str += to_string(shop->GetGoodsPrice());
str += ",产品介绍:";
str += shop->GetGoodsIntroduction();
return str;
}
virtual string GetECName()
{
return "某宝";
}
};
class MouDong : public ECommercePlatform
{
public:
MouDong() = default;
virtual ~MouDong() = default;
public:
virtual bool PutawayGoods(ElectricalShop* shop)
{
if (!CheckAnnualFee(shop)) return false;
ShowShop(shop);
return true;
}
protected:
virtual bool CheckAnnualFee(ElectricalShop* shop)
{
auto af = shop->GetAssets();
auto residue = af - GetPlatformForTheAnnualFee();
bool isPass = residue > 0;
string str(shop->GetShopName());
if (isPass)
{
str += "交完";
str += GetECName();
str += "平台年费后还剩:";
str += to_string(residue);
}
else
{
str += "资产不足以交";
str += GetECName();
str += "平台年费,上架失败";
}
cout << str << endl;
return isPass;
}
virtual void ShowShop(ElectricalShop* shop)
{
cout << MergeGoodsInfo(shop) << endl;
}
virtual double GetPlatformForTheAnnualFee()
{
return 60000;
}
virtual string MergeGoodsInfo(ElectricalShop* shop)
{
string str(shop->GetShopName());
str += "的";
str += shop->GetGoodsName();
str += "产品在";
str += GetECName();
str += "平台上架成功,售价为:";
str += to_string(shop->GetGoodsPrice());
str += ",产品介绍:";
str += shop->GetGoodsIntroduction();
return str;
}
virtual string GetECName()
{
return "某东";
}
};
- 商家类:
#pragma once
#include "ElectricalShop.h"
class i7Computer : public ElectricalShop
{
public:
i7Computer() = default;
virtual string GetShopName()
{
return "军工级电脑旗舰店";
}
virtual string GetGoodsName()
{
return "i7游戏电脑";
}
virtual string GetGoodsIntroduction()
{
return "i7级8核16线Cpu,军工级主板,16G大内存,8G显卡,你值得拥有";
}
virtual double GetGoodsPrice()
{
return 5899;
}
virtual double GetAssets()
{
return 80000;
}
};
class i9Computer : public ElectricalShop
{
public:
i9Computer() = default;
virtual string GetShopName()
{
return "航天级电脑旗舰店";
}
virtual string GetGoodsName()
{
return "i9高端游戏电脑";
}
virtual string GetGoodsIntroduction()
{
return "i9级10核20线Cpu,航天级主板,32G大内存,12G显卡,你值得拥有";
}
virtual double GetGoodsPrice()
{
return 9999;
}
virtual double GetAssets()
{
return 100000;
}
};
class ComputerPeripherals : public ElectricalShop
{
public:
ComputerPeripherals() = default;
virtual string GetShopName()
{
return "高端电脑外设旗舰店";
}
virtual string GetGoodsName()
{
return "电脑外设套装";
}
virtual string GetGoodsIntroduction()
{
return "好马配好鞍,外设套装你怎么能没有";
}
virtual double GetGoodsPrice()
{
return 2999;
}
virtual double GetAssets()
{
return 50000;
}
};
- 引用:
#include "Platform.h"
int main()
{
shared_ptr<ElectricalShop> s1(new i7Computer);
shared_ptr<ElectricalShop> s2(new i9Computer);
shared_ptr<ElectricalShop> s3(new ComputerPeripherals);
shared_ptr<ECommercePlatform> e1(new MouBao);
e1->PutawayGoods(s1.get());
e1->PutawayGoods(s2.get());
e1->PutawayGoods(s3.get());
shared_ptr<ECommercePlatform> e2(new MouDong);
e2->PutawayGoods(s1.get());
e2->PutawayGoods(s2.get());
e2->PutawayGoods(s3.get());
getchar();
return 0;
}
总结:
桥接模式(Bridge):提高了系统的可扩充性,在各个维度中任意扩展一个维度,都不需要修改原有系统,实现细节对客户透明,对用户隐藏实现细节
作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)