前言
一、什么是桥(bridge)模式?
桥(Bridge)模式是用于把抽象化(通常是抽象类)与实现(接口)解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
二、C++伪代码实例
1.示意图与场景举例说明
假设当前需要实现提供统一的文件系统接口给用户这个要求,使用桥接模式实现的示意图如下
2.C++伪代码实现
场景描述:
客户使用的是抽象类FileApi,客户不管在任何平台下,使用的都是抽象类提供的统一接口,不关心具体实现,一套客户代码,多个平台可用(抽象和具体实现解耦(示意图绿框部分与红框部分))。
C++伪代码如下(示例):
//FileSystem,即实现的抽象基类
class FileSystem{
public:
//给子类具体类实现的接口
virtual void * file_open(void * arg) = 0;
virtual void * file_write(void * arg) = 0;
//后面省略......................
};
//FileSystem具体实现之Linux
class LinuxFileSystem:public FileSystem{
public:
virtual void * file_open(void * arg) {
count << "Linux open" << endl;
};
virtual void * file_write(void * arg){
count << "Linux write" << endl;
};
//后面省略......................
};
//FileSystem具体实现之Windows
class WindowsFileSystem:public FileSystem{
public:
virtual void * file_open(void * arg) {
count << "Windows open" << endl;
};
virtual void * file_write(void * arg){
count << "Windows write" << endl;
};
//后面省略......................
};
//提供给客户的抽象层
class FileApi{
private:
FileSystem* os_fs;
public:
/*两种或以上的构造函数*/
FileApi(void){
//自动判断客户当前的系统类型,下面假设当前是Linux
//伪代码如下:
//Linux = get_sys_type();
//this->os_fs = new LinuxFileSystem();
};
FileApi(sys_type){
//或让客户传入配置类型,假设传入Windows系统
this->os_fs = new WindowsFileSystem();
};
/*该类都是虚函数,客户有特殊需要也能继承该类重写或新增接口,无需求时可直接使用该类接口*/
virtual int get_sys_type(){//该接口可用于获取系统类型
return sys_type;
};
virtual void * open(void * arg){
this->os_fs ->file_open(arg);//调用具体系统的实现
};
virtual void * write(void * arg){
this->os_fs ->file_write(arg);//调用具体系统的实现
};
};
3.客户使用代码
示例代码如下:
int main() {
//让类自行判断,假设当前是Linux系统
FileApi * linux_api = New FileApi();
linux_api->open("abc.txt",.......);
linux_api->write(.......);
return 0;
}
总结
优点: 1、分离接口及其实现部分。 2、优秀的扩展能力。 3、可以隐藏实现细节 4.减少类的数量缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。