• 桥接模式(C++)


    介绍

    桥接模式: 将抽象部分和实现部分分离,使它们可以独立变换. 属于结构型模式.

    目的: 在有多种可能变化情况下,使用继承可能会造成类爆炸的问题,扩展起来不灵活.

    使用场景:

    • 当一个对象具有多个变化因素时,考虑依赖于抽象的实现,而不是具体实现;
    • 当多个变化因素在多个对象之间共享时,考虑将这部分的变化部分抽象出来,再聚合/集成进去.
    • 当一个对象的多个变化因素可以动态变化时.

    优点:

    • 抽象实现分离;
    • 优秀的扩展能力;
    • 实现细节对客户透明.

    缺点:

    • 会增加系统的设计难度理解难度

    接口耦合,而不是实现耦合.

    整个关键就是组合的使用. 当有多维度变化时,可以考虑使用桥接模式.

    UML

    image

    示例

    #include <iostream>
    
    //抽象接口
    class App {
    public:
        virtual ~App() {}
        virtual void Run() = 0;
    };
    
    //具体实现类
    class ChatApp : public App {
    public:
        void Run() override {
            std::cout << "--------CharApp-----" << std::endl;
        }
    };
    
    //具体实现类
    class GameApp : public App {
    public:
        void Run() override {
            std::cout << "---------GameApp-----" << std::endl;
        }
    };
    
    //抽象电脑接口
    class Computer {
    public:
        virtual ~Computer() {}
        //实现与App的桥接
        virtual void RunApp(App* app) = 0;
    };
    
    //具体的电脑实现类
    class DellPC : public Computer {
    public:
        void RunApp(App* app) {
            std::cout << "------DellPC------" << std::endl;
            app->Run();
        }
    };
    
    //具体的电脑实现类
    class LenovePC: public Computer {
    public:
        void RunApp(App* app) {
            std::cout << "------lenovePC-----" << std::endl;
            app->Run();
        }
    };
    
    int main() {
        ChatApp chat_app;
        App *chat_app = new ChatApp();
        App *game_app = new GameApp();
        Computer *dell_pc = new DellPC();
        Computer *lenove_pc = new LenovePC();
        dell_pc->RunApp(chat_app);
        dell_pc->RunApp(game_app);
        lenove_pc->RunApp(chat_app);
        lenove_pc->RunApp(game_app);
        
        delete chat_app;
        delete game_app;
        delete dell_pc;
        delete lenove_pc;
        return 0;
    }
    

    适配器模式和桥接模式的区别?

    主要是使用场景不同:

    • 适配器模式主要解决两个已有接口之间的匹配问题;
    • 桥接模式是分离抽象和实现,使两者接口可以不同.
  • 相关阅读:
    Timestamp (rowversion) Data Type
    replace(/\s/g,"")中的/g是什么意思? 及replace函数的用法
    取消ie6自动打开excel
    C#日期函数使用大全
    Photoshop制作Favicon.ico图标(转载)
    为什么就没有中文版 数据库设计和优化 的书呢
    C#操作Access的一些小结
    asp.net 下发布水晶报表调试经验
    ASREP Roasting & Kerberoast
    重新点亮linux 基本软件————防火墙[一]
  • 原文地址:https://www.cnblogs.com/xl2432/p/13139757.html
Copyright © 2020-2023  润新知