一、使用场景
拿电脑来举例子。电脑有微软的电脑,联想的电脑。而电脑上可以运行游戏,也可以运行记事本等软件。有两种方式可以实现电脑产品,如下:
方式一:
这种方式耦合性太高,比如像添加一种软件,需要添加微软电脑的软件和联想电脑的软件。同样的像添加一种电脑,也要添加相应的软件。如果要修改一种软件,则要修改很多软件。
方式二,那就是电脑是电脑,软件是软件两者分离。如下图:
很明显方式二耦合性底,容易维护和扩展。这里电脑就相当于抽线,而软件则相当于实现。总的来说就是桥接模式主要是实现系统可能有多个角度分类,每一种分类都有可能变化。那么就把这种多角度分离出来
让它们独立变化,减少它们之间的耦合。
二、定义
多个角度看问题,每一个角度有一个抽象类,抽象类底下具体的类即是各个角度看问题看到的具体内容,同时不同角度看问题的基类是用组合的形式联系起来的,这样子可以替代多个类之间频繁继承的现象,减少类的个数,同时避免因为不断继承打破开闭原则。
三、代码
以电脑和软件为例其示例代码如下:
// BridgeModel.h文件
#pragma once
#include <iostream>
class Software
{
public:
virtual void run() = 0;
};
class SoftwareGame : public Software
{
public:
void run()
{
std::cout << "游戏软件" << std::endl;
}
};
class SoftwareNote : public Software
{
public:
void run()
{
std::cout << "记事本软件" << std::endl;
}
};
//
class Computer
{
protected:
Software * m_software;
public:
Computer() : m_software(nullptr){}
virtual ~Computer()
{
if (nullptr == m_software)
delete m_software;
}
virtual void run() = 0;
void setSoftware(Software *p)
{
m_software = p;
}
};
class ComputerLenovo : public Computer
{
public:
void run()
{
std::cout << "联想的电脑运行";
m_software->run();
}
};
class ComputerMirco : public Computer
{
public:
void run()
{
std::cout << "微软的电脑运行";
m_software->run();
}
};
客户端代码如下:
#include <iostream>
#include "BridgeModel.h"
int main()
{
using namespace std;
// 桥接模式
Computer *p = new ComputerLenovo();
p->setSoftware(new SoftwareGame());
p->run();
delete p;
p = new ComputerMirco();
p->setSoftware(new SoftwareNote());
p->run();
delete p;
getchar();
return 0;
}