桥接模式
如果类存在两个维度可以独立变化,我们可以将这两个维度分离开,从而使它们可以独自变化,独立扩展。这就是桥接模式要做的事。
下面的示例,将电脑和软件做了分离抽象,实现了电脑和软件可以独立变化的能力。
电脑内包含软件,电脑种类众多,软件种类同样众多。使用桥接模式把电脑与其中的软件桥接起来,把抽象概括起来。需要拓展时只需要添加具体的电脑和具体的软件类。
代码示例
#include <iostream>
class ISoftware //软件抽象类
{
public:
virtual void run() = 0;
};
class SoftwareGame : public ISoftware
{
public:
void run()
{
std::cout << "游戏软件" << std::endl;
}
};
class SoftwareWork : public ISoftware
{
public:
void run()
{
std::cout << "干活软件" << std::endl;
}
};
class Computer //电脑抽象类,包含软件抽象类对象,具体软件的运行由具体对象去实现
{
protected:
ISoftware * 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 ComputerA : public Computer
{
public:
void run()
{
std::cout << "ComputerA 电脑运行";
m_software->run();
}
};
class ComputerB : public Computer
{
public:
void run()
{
std::cout << "ComputerB 电脑运行";
m_software->run();
}
};
int main()
{
// 桥接模式
Computer *pa = new ComputerA();
pa->setSoftware(new SoftwareGame());
pa->run();
delete pa;
Computer *pb = new ComputerB();
pb->setSoftware(new SoftwareNote());
pb->run();
delete pb;
getchar();
return 0;
}
优点:
桥接模式可以灵活组合,用来取代多层继承关系,避免多层继承引起的子类爆炸式增长;
桥接模式提高了系统可扩展性,某个维度上需要扩展时,只需增加实现类接口或者具体实现类,不影响另一个维度,符合开闭原则。
缺点:
难以理解,维度关系建立在抽象类层Computer类;准确识别系统中的两个维度是应用桥接模式的难点。
适用场景:
一个类存在多个独立变化的维度,可采用桥接模式。