《C++新经典设计模式》之第16章 桥接模式

《C++新经典设计模式》之第16章 桥接模式

桥接模式.cpp
cpp 复制代码
#include <iostream>
#include <memory>
using namespace std;

// 将抽象部分(业务功能)与其实现部分(具体的平台实现)分离,使它们都可以独立地变化和扩展
// 4种角色
// Abstraction(抽象部分相关接口),定义抽象类接口,包含指向Implementor类型对象的指针
// RefinedAbstraction(扩充抽象部分接口),实现Abstraction接口,并调用Implementor方法
// Implementor(实现部分相关接口),定义实现类接口
// ConcreteImplementor(实现部分具体类),实现Implementor接口

namespace ns1
{
    class Image // 图像显示相关类
    {
        virtual char *parsefile(const char *pfilename, int &iLen) = 0; // 文件名决定文件格式,不同读取和处理代码, 返回二进制数据格式

    public:
        virtual ~Image() {}
        void draw(const char *pfilename)
        {
            int iLen = 0;
            char *pData = parsefile(pfilename, iLen);
            if (iLen > 0)
            {
                cout << "Displays the image data in the buffer pointed by pData" << endl;
                delete pData; // 模拟代码中因为pData的内存是new出来的,这里需要释放该内存
            }
        }
    };

    class Image_png : public Image // 处理png格式图像文件的显示
    {
        char *parsefile(const char *pfilename, int &iLen) override // 读取png文件内容并进行解析
        {
            // 以下是模拟代码:模拟从图像文件中读取到了数据,最终转换成了100个字节的数据格式(事先约定好的格式规范)并返回
            cout << "Start analyzing the data in the png file and put the analysis results in pData";
            iLen = 100;
            char *presult = new char[iLen];
            return presult;
        }
    };

    class Image_jpg : public Image // 处理jpg格式图像文件的显示
    {
    private:
        char *parsefile(const char *pfilename, int &iLen) override
        {
            cout << "Start analyzing the data in the jpg file and put the analysis results in pData";
            iLen = 0;
            return NULL;
        }
    };

    class Image_bmp : public Image // 处理bmp格式图像文件的显示
    {
    private:
        char *parsefile(const char *pfilename, int &iLen) override
        {
            cout << "Start analyzing the data in the bmp file and put the analysis results in pData";
            iLen = 0;
            return NULL;
        }
    };
}

namespace ns2
{
    class ImageOS // 操作系统类型相关类
    {
    public:
        virtual ~ImageOS() {}
        virtual void draw(char *pData, int iLen) = 0;
    };

    class ImageOS_Windows : public ImageOS // Windows操作系统
    {
    public:
        void draw(char *pData, int iLen) override
        {
            cout << "Display the image data in the buffer pointed by pData under Windows operating system" << endl;
        }
    };

    class ImageOS_Linux : public ImageOS // Linux操作系统
    {
    public:
        void draw(char *pData, int iLen) override
        {
            cout << "Display the image data in the buffer pointed by pData under Linux operating system" << endl;
        }
    };

    class ImageOS_Mac : public ImageOS // Mac操作系统
    {
    public:
        void draw(char *pData, int iLen) override
        {
            cout << "Display the image data in the buffer pointed by pData under Mac operating system" << endl;
        }
    };

    class ImageFormat // 图像文件格式相关类
    {
    protected:
        shared_ptr<ImageOS> m_pImgOS; // 委托
    public:
        virtual ~ImageFormat() {}
        ImageFormat(const shared_ptr<ImageOS> &pimgos) : m_pImgOS(pimgos) {}
        virtual void parsefile(const char *pfilename) = 0; // 文件名, 文件格式,不同读取和处理代码
    };

    class Image_png : public ImageFormat // png格式的图像文件
    {
    public:
        Image_png(const shared_ptr<ImageOS> &pimgos) : ImageFormat(pimgos) {}
        void parsefile(const char *pfilename) override
        {
            cout << "Start analyzing the data in the png file and put the analysis results in pData, ";
            // 以下是模拟代码:模拟从图像文件中读取到了数据,最终转换成了100个字节的数据格式(事先约定好的格式规范)并返回
            int iLen = 100;
            char *presult = new char[iLen];
            m_pImgOS->draw(presult, iLen);
            delete presult;
        }
    };

    class Image_jpg : public ImageFormat // jpg格式的图像文件
    {
    public:
        Image_jpg(const shared_ptr<ImageOS> &pimgos) : ImageFormat(pimgos) {}
        void parsefile(const char *pfilename) override
        {
            cout << "Start analyzing the data in the jpg file and put the analysis results in pData, ";
        }
    };

    class Image_bmp : public ImageFormat // bmp格式的图像文件
    {
    public:
        Image_bmp(const shared_ptr<ImageOS> &pimgos) : ImageFormat(pimgos) {}
        void parsefile(const char *pfilename) override
        {
            cout << "Start analyzing the data in the bmp file and put the analysis results in pData, ";
        }
    };
}

int main()
{
#if 0
    using namespace ns1;
    shared_ptr<Image> pImg(new Image_png());
    pImg->draw("c:\\somedir\\filename.jpg");
#endif

#if 1
    using namespace ns2;
    shared_ptr<ImageOS> pimgos_windows(new ImageOS_Windows());       // 针对Windows操作系统
    shared_ptr<ImageFormat> pimg_png(new Image_png(pimgos_windows)); // 运行时把图像文件格式(png)和操作系统(Windows) 动态组合到一起
    pimg_png->parsefile("c:\\somedir\\filename.png");
#endif

    cout << "Over!\n";
    return 0;
}
相关推荐
踏莎行hyx18 分钟前
使用langchain连接llama.cpp部署的本地deepseek大模型开发简单的LLM应用
c++·ai·langchain·大模型·llama.cpp·deepseek
山河木马26 分钟前
前端学C++可太简单了:双冒号 :: 操作符
前端·javascript·c++
鸡蛋灌Bean27 分钟前
Java常用设计模式大全
java·开发语言·设计模式
喝可乐的布偶猫28 分钟前
Java-----韩顺平单例设计模式学习笔记
java·笔记·设计模式
WISHMELUCK1'30 分钟前
设计模式的六大设计原则
设计模式·接口隔离原则·依赖倒置原则·里氏替换原则·迪米特法则·合成复用原则·单一职责原则
乌萨奇也要立志学C++1 小时前
【C++详解】STL-list模拟实现(深度剖析list迭代器,类模板未实例化取嵌套类型问题)
c++·list
闻缺陷则喜何志丹2 小时前
【前缀和 BFS 并集查找】P3127 [USACO15OPEN] Trapped in the Haybales G|省选-
数据结构·c++·前缀和·宽度优先·洛谷·并集查找
序属秋秋秋3 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
Hellyc8 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
追烽少年x8 小时前
设计模式---观察者模式(发布-订阅模式)
网络·设计模式