一、概述
桥接是一种结构型设计模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。
1.结构
-
抽象部分(Abstraction)提供高层控制逻辑, 依赖于完成底层实际工作的实现对象。
-
实现部分(Implementation)为所有具体实现声明通用接口。抽象部分仅能通过在这里声明的方法与实现对象交互。抽象部分可以列出和实现部分一样的方法,但是抽象部分通常声明一些复杂行为,这些行为依赖于多种由实现部分声明的原语操作。
-
具体实现(Concrete Implementations)中包括特定于平台的代码。
-
精确抽象(Refined Abstraction)提供控制逻辑的变体。与其父类一样,它们通过通用实现接口与不同的实现进行交互。
-
客户端(Client)仅关心如何与抽象部分合作。但是,客户端需要将抽象对象与一个实现对象连接起来。
2.适用场景
-
想要拆分或重组一个具有多重功能的庞杂类(例如能与多个数据库服务器进行交互的类),可以使用桥接模式。
-
当对象存在多种变化的因素时,考虑对其变化的因素和场景进行抽象,然后进行桥接;如笔拥有不同的功能。
-
当多个对象存在多种变化的因素时,考虑将这部分变化的部分抽象出来再聚合进来;比如不同品牌的电脑安装不同的系统、使用不同的软件等,相当于将第一条进行横向扩展,增加桥接的数量。
3.优缺点
优点:
-
开闭原则。你可以新增抽象部分和实现部分,且它们之间不会相互影响。
-
单一职责原则。抽象部分专注于处理高层逻辑,实现部分处理平台细节。
-
其实现细节对客户透明。
-
抽象与实现分离,扩展能力强。
缺点:
- 高内聚的类使用该模式可能会让代码更加复杂。
二、实例
#include<iostream>
#include<string>
using namespace std;
//手机软件
class HandsetSoft
{
public:
virtual void Run() = 0;
};
//游戏软件
class HandsetGame:public HandsetSoft
{
public:
virtual void Run()
{
cout << "运行手机游戏" << endl;
}
};
//通讯录软件
class HandsetAddressList :public HandsetSoft
{
public:
virtual void Run()
{
cout << "手机通讯录" << endl;
}
};
//手机品牌
class HandsetBrand
{
protected:
HandsetSoft* m_soft;
public:
void SetHandsetSoft(HandsetSoft* temp)
{
m_soft = temp;
}
virtual void Run() = 0;
};
//M品牌
class HandsetBrandM :public HandsetBrand
{
public:
virtual void Run()
{
m_soft->Run();
}
};
//N品牌
class HandsetBrandN :public HandsetBrand
{
public:
virtual void Run()
{
m_soft->Run();
}
};
//客户端
int main()
{
HandsetBrand* brand;
brand = new HandsetBrandM();
//HandsetSoft * temp = new HandsetGame();
brand->SetHandsetSoft(new HandsetGame());
brand->Run();
brand->SetHandsetSoft(new HandsetAddressList());
brand->Run();
return 0;
}