目的:将抽象部分与实现部分分离,使它们都可以独立的变化。
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式
实现和接口解耦,吧继承关系 改为组合关系,从而应对多个实现的变化需求,C++ Impl手法就是一个Bridge模式的实现方法
以下是一个场景
1)客户给了你一个需求,于是使用一个类来实现(A);
2)客户需求变化,有两个算法实现功能,于是改变设计,我们通过一个抽象的基类,再定义两个具体类实现两个不同的算法(A1和A2);
3)客户又告诉我们说对于不同的操作系统,于是再抽象一个层次,作为一个抽象基类A0,在分别为每个操作系统派生具体类(A00和A01,其中A00表示原来的类A)实现不同操作系统上的客户需求,这样我们就有了一共4个类。
4)可能用户的需求又有变化,比如说又有了一种新的算法……..
5)我们陷入了一个需求变化的郁闷当中,也因此带来了类的迅速膨胀。
Bridge模式则正是解决了这类问题。
例子1
class AbstractionImpl
{
public:
virtual void Operation() = 0;
};
class AbstractionImplA :public AbstractionImpl
{
public:
virtual void Operation()override
{
cout << "do Action" << endl;
}
};
class Abstraction
{
public:
virtual void Operation() = 0;
};
class RefinedAbstrantion :public Abstraction
{
public:
virtual void Operation()override
{
impl->Operation();
}
RefinedAbstrantion(AbstractionImpl *impl)
{
this->impl = impl;
}
private:
AbstractionImpl *impl;
};
int main(int argc, char *argv[])
{
AbstractionImpl *impl = new AbstractionImplA;
Abstraction *abs = new RefinedAbstrantion(impl);
abs->Operation();
system("pause");
return 0;
}
//达到了 多个变化的维度,而不是通过简单的继承
例2
玩家和武器系统
class Weapon
{
public:
virtual void use() = 0;
};
class WeaponImpl
{
public:
void use()
{
weapon->use();
}
WeaponImpl(Weapon* wea)
{
this->weapon = wea;
}
private:
Weapon * weapon;
};
class Gun :public Weapon
{
public:
virtual void use()override
{
cout << "shoot" << endl;
}
};
class Player
{
public:
void EquipWeapon(WeaponImpl* weapon)
{
this->weaponImpl = weapon;
}
void useWeapon()
{
weaponImpl->use();
}
private:
WeaponImpl *weaponImpl;
};
int main(int argc, char *argv[])
{
WeaponImpl* impl = new WeaponImpl(new Gun);
Player *player = new Player;
player->EquipWeapon(impl);
player->useWeapon();
return 0;
}