桥接模式
概念
: 将抽象部分和实现部分分离, 使他们都可以独立的变化
概念很抽象, 难以理解, 我们举个例子
例子
设想三种不同品牌的汽车
大车
中车
小车
三种不同类型的引擎
纯电引擎
混动引擎
燃油引擎
如果我们把他们两两组合, 都继承同一个类的话,就会有9个类, 并且如果后续继续扩展车的类型或者引擎的话, 那类的数量就爆炸了, 如下图所示
class Car
class ElectricalBigCar : Car
class ElectricalMiddleCar : Car
class ElectricalSmallCar : Car
所以我们不要过度使用继承
, 可以优先考虑拆分, 我们将引擎类单独拆分出来, 然后Car类包含引擎类, 这样就会大大减少类的数量
代码
class Engine
{
public:
virtual void start() = 0;
};
class ElectricalEngine : public Engine
{
public:
void start() override
{
cout << "electrical engine start" << endl;
}
};
class HybridEngine : public Engine
{
public:
void start() override
{
cout << "hybrid engine start" << endl;
}
};
class FuelEngine : public Engine
{
public:
void start() override
{
cout << "fuel engine start" << endl;
}
};
class Car
{
private:
Engine* e;
public:
Car(Engine* _e) : e(_e) {};
virtual void start() = 0;
void run()
{
e->start();
start();
}
};
class SmallCar : public Car
{
public:
SmallCar(Engine* e) : Car(e) {};
void start()
{
cout << "small car start" << endl;
}
};
class MiddleCar : public Car
{
public:
MiddleCar(Engine* e) : Car(e) {};
void start()
{
cout << "middle car start" << endl;
}
};
class BigCar : public Car
{
public:
BigCar(Engine* e) : Car(e) {};
void start()
{
cout << "big car start" << endl;
}
};
int main()
{
BigCar* bc = new BigCar(new FuelEngine());
bc->run();
return 0;
}
执行结果
设计思想
桥接模式的设计思想就是, 不要过度使用继承,而是优先拆分某些部件,使用组合的方式来扩展功能。