C++桥接模式(Bridge)

    xiaoxiao2023-11-17  141

    UML类图(仅供参考)如下:

    桥接模式解决的问题:

    抽象类之间为聚合关系,将抽象部分与实现部分分离,使它们都可以独立的变化,这样他们的子类就可以任意聚合在一起

    源码

    #include <iostream> // 抽象类,桥的一部分 class CAbstractionImplement { public: virtual ~CAbstractionImplement() {} // 定义接口,表示该类所支持的操作 virtual void Operation() = 0; protected: CAbstractionImplement() {} }; // 具体实现A class CConcreteAbstractionImplementA :public CAbstractionImplement { public: virtual void Operation() { std::cout << "CConcreteAbstractionImplementA::Operation" << std::endl; } }; // 具体实现B class CConcreteAbstractionImplementB :public CAbstractionImplement { public: virtual void Operation() { std::cout << "CConcreteAbstractionImplementB::Operation" << std::endl; } }; // 抽象类,桥的另一部分 class CAbstraction { public: virtual ~CAbstraction() {} // 定义接口,表示该类所支持的操作 virtual void Operation() = 0; protected: CAbstraction(CAbstractionImplement* imp) :_imp(imp) {} // CAbstraction与CAbstractionImplement为聚合 // 这样他们的子类可以以任何方式组合,从而实现桥接模式 CAbstractionImplement *_imp; }; // 具体实现A class CRefinedAbstractionA :public CAbstraction { public: CRefinedAbstractionA(CAbstractionImplement* imp) :CAbstraction(imp) {} virtual void Operation() { std::cout << "CRefinedAbstractionA::Operation" << std::endl; this->_imp->Operation(); } }; // 具体实现A class CRefinedAbstractionB :public CAbstraction { public: CRefinedAbstractionB(CAbstractionImplement* imp) :CAbstraction(imp) {} virtual void Operation() { std::cout << "CRefinedAbstractionB::Operation" << std::endl; this->_imp->Operation(); } }; // 测试 int main() { CAbstractionImplement* imp = new CConcreteAbstractionImplementA(); CAbstraction* abs = new CRefinedAbstractionA(imp); abs->Operation(); std::cout << "-----------------------------------------" << std::endl; CAbstractionImplement* imp1 = new CConcreteAbstractionImplementB(); CAbstraction* abs1 = new CRefinedAbstractionA(imp1); abs1->Operation(); std::cout << "-----------------------------------------" << std::endl; CAbstractionImplement* imp2 = new CConcreteAbstractionImplementA(); CAbstraction* abs2 = new CRefinedAbstractionB(imp2); abs2->Operation(); std::cout << "-----------------------------------------" << std::endl; CAbstractionImplement* imp3 = new CConcreteAbstractionImplementB(); CAbstraction* abs3 = new CRefinedAbstractionB(imp3); abs3->Operation(); }

    好处

    1、抽象和实现的分离。

    2、优秀的扩展能力。

    3、实现细节对客户透明

    最新回复(0)