设计模式-结构-Bridge(桥接)模式
目的:将抽象部分与实现部分分离,使它们都可以独立的变化。
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式
实现和接口解耦,吧继承关系 改为组合关系,从而应对多个实现的变化需求,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;
- }