• C++设计模式-桥接(Bridge)


    目录

    C++设计模式-桥接(Bridge)

    一、意图

    二、适用性

    三、结构

    四、参与者

    五、代码


    C++设计模式-桥接(Bridge)

    一、意图

    将抽象部分与它的实现部分分离,使它们都可以独立地变化。

    二、适用性

    • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
    • 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
    • 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
    • (C++)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的。
    • 有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。Rumbaugh称这种类层次结构为“嵌套的普化”(nested generalizations )。
    • 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。一个简单的例子便是Coplien的String类[Cop92],在这个类中多个对象可以共享同一个字符串表示(S tringRep)。

    三、结构

     

    四、参与者

    • Abstraction

            定义抽象类的接口。

            维护一个指向Implementor类型对象的指针。

    • RefinedAbstraction

            扩充由Abstraction定义的接口。

    • Implementor

            定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基本这些基本操作的较高层次的操作。

    • ConcreteImplementor

            实现了Implementor接口并定义它的具体实现。

    五、代码

    1. #include
    2. using namespace std;
    3. class Implementor {
    4. public:
    5. virtual void OperationImp() = 0;
    6. };
    7. class ConcreteImplementorA : public Implementor {
    8. public:
    9. virtual void OperationImp() {
    10. cout << "Concrete Implementor A" << endl;
    11. }
    12. };
    13. class ConcreteImplementorB : public Implementor {
    14. public:
    15. virtual void OperationImp() {
    16. cout << "Concrete Implementor B" << endl;
    17. }
    18. };
    19. class Abstraction {
    20. public:
    21. virtual void Operation() = 0;
    22. };
    23. class RefinedAbstraction : public Abstraction {
    24. public:
    25. RefinedAbstraction(Implementor* TempImplementor) {
    26. this->implementor = TempImplementor;
    27. }
    28. void Operation() {
    29. implementor->OperationImp();
    30. }
    31. private:
    32. Implementor* implementor;
    33. };
    34. int main() {
    35. Implementor* implementorA = new ConcreteImplementorA;
    36. Abstraction* abstractionA = new RefinedAbstraction(implementorA);
    37. abstractionA->Operation();
    38. Implementor* implementorB = new ConcreteImplementorB;
    39. Abstraction* abstractionB = new RefinedAbstraction(implementorB);
    40. abstractionB->Operation();
    41. return 0;
    42. }

  • 相关阅读:
    快手视频批量下载.py(10月可以用)
    基于b/s架构搭建一个支持多路摄像头的实时处理系统(2) ---- 使用yolo v5 模型基于GPU 多进程处理视频流
    高质量C/C++代码-----第二章 命名规则
    asp.net健身会所管理系统sqlserver
    8年资深测试,自动化测试常见问题总结,惊险避坑...
    Lwip之TCP客户端示例记录
    如何抓取网站的内容而不被阻止?
    Vue2中$set的使用
    3.4 Swaps
    每日一题 213. 打家劫舍 II
  • 原文地址:https://blog.csdn.net/qq_40660998/article/details/133622954