将抽象部分与它的实现分离,使他们都可以独立地变化。
抽象与实现的分离方法,是借助耦合。
对于一个派生类而言,其从基类继承了抽象函数,并对抽象函数进行实现,这是常规的抽象与实现耦合的情况。
而,若将函数实现的功能代码抽出,放到一个特定的实现类里,并将该类对象作为派生类的成员变量。当派生类对继承的抽象函数进行实现时,就可以调用实现类对象的接口函数,从而实现了相同的效果。
如:
class Car
{
public:
virtual void construct() = 0;
};
class TeslaCar : public Car
{
public:
virtual void construct();
{
//进行制造;
};
};
上面定义了
Car类,其有个虚函数
construct
()。
派生类TeslaCar对虚函数construct()进行了实现。
若使用桥接模式,上面代码会变为下面的形式:
//将虚函数的功能抽出
class Construction
{
public:
virtual void construct();
{
//进行制造;
};
};
class Car
{
public:
virtual void construct() = 0;
};
class TeslaCar : public Car
{
public:
TeslaCar(Construction* construction)
{
_construction = construction;
};
//构造函数
virtual void construct();
{
_construction->construct();
};
private:
Construction* _construction;
};
这样,抽象和其实现就进行了分离。
1. 设现在要添加十个新的Car派生类
① 若采用原始的派生类实现功能的方式,,由于每个派生类都要实现construct()函数,且这些construct()函数都是相同的,那么就相当于出现了很多的重复代码,且该重复的规模会随着Car派生类的添加不断增大。
② 若采用桥接模式,由于实现类Construction可复用,所以只要添加派生类即可,派生类的construct()函数中的功能代码不用重复编写。
2. 设现在有十种Car派生类,其中有五种需要使用不同的另一种构造方式
① 若采用原始的派生类实现功能的方式,那么需要为这五种派生类依次修改construct()函数,且修改的内容相同。这样会做许多重复性工作。
② 若采用桥接模式,直接派生一个NewConstruction,将NewConstruction作为参数传入,修改就完成了。只需要创建一个新的类NewConstruction。
因此,若抽象类及其子类需要变化(抽象部分变化),无需修改实现类;若实现部分变化,无需修改抽象类及其子类。同时,不同的抽象部分可以灵活地与不同的实现类进行组合,从而实现不同功能。
若抽象类有多种实现,那么使用桥接模式要远远优于继承。