本文主要是介绍桥接模式详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
桥接模式
概念
: 将抽象部分和实现部分分离, 使他们都可以独立的变化
概念很抽象, 难以理解, 我们举个例子
例子
设想三种不同品牌的汽车
大车
中车
小车
三种不同类型的引擎
纯电引擎
混动引擎
燃油引擎
如果我们把他们两两组合, 都继承同一个类的话,就会有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;
}
执行结果
设计思想
桥接模式的设计思想就是, 不要过度使用继承,而是优先拆分某些部件,使用组合的方式来扩展功能。
这篇关于桥接模式详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!