设计模式-结构-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; }