《C++新经典设计模式》之第15章 适配器模式

《C++新经典设计模式》之第15章 适配器模式

适配器模式.cpp
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <memory>
using namespace std;

// 解决两个类之间的兼容性问题
// 转换接口调用
// 3种角色
// Target(目标抽象类),定义需要暴露的接口
// Adaptee(适配者类),被适配角色,多个老接口
// Adapter(适配器类),包装类,转换器角色

// 既有东西增减内容就成为了一个适配器
// 容器适配器,双端队列deque减少东西就能实现stack和queue
// 算法适配器,std::bind(绑定器)
// 迭代器适配器,reverse_iterator(反向迭代器),对迭代器iterator的简单封装

namespace ns1
{
   
    class LogToFile // 日志文件操作相关类
    {
   
    public:
        void initfile() {
   }                        // 做日志文件初始化工作,比如打开文件等等
        void writetofile(const char *pcontent) {
   } // 将日志内容写入文件
        void readfromfile() {
   }                    // 从日志中读取一些信息
        void closefile() {
   }                       // 关闭日志文件
    };
}

namespace ns2
{
   
    class LogToDatabase // 日志操作相关类(数据库版本)
    {
   
    public:
        void initdb() {
   }                        // 连接数据库,做一些基本的数据库连接设置等
        void writetodb(const char *pcontent) {
   } // 将日志内容写入数据库
        void readfromdb() {
   }                    // 从数据库中读取一些日志信息
        void closedb() {
   }                       // 关闭到数据库的连接
    };
}

namespace ns3
{
   
    class LogToFile // 日志文件操作相关类
    {
   
    public:
        void initfile() {
   }                        // 做日志文件初始化工作,比如打开文件等等
        void writetofile(const char *pcontent) {
   } // 将日志内容写入文件
        void readfromfile() {
   }                    // 从日志中读取一些信息
        void closefile() {
   }                       // 关闭日志文件
    };

    class LogToDatabase
    {
   
    public:
        virtual ~LogToDatabase() {
   }

        virtual void initdb() = 0; // 不一定非是纯虚函数
        virtual void writetodb(const char *pcontent) = 0;
        virtual void readfromdb() = 0;
        virtual void closedb() = 0;
    };

    class LogAdapter : public LogToDatabase // 对象适配器,通过组合,委托实现
    {
   
        shared_ptr<LogToFile> m_pfile;

    public:
        LogAdapter(const shared_ptr<LogToFile> &pfile = make_shared<LogToFile>()) : m_pfile(pfile) {
   } // 形参是老接口所属类
        void initdb() override
        {
   
            cout << "LogAdapter::initdb() Adapter LogToFile::initfile()" << endl;
            m_pfile->initfile();
        }
        void writetodb(const char *pcontent) override
        {
   
            cout << "LogAdapter::writetodb() Adapter LogToFile::writetofile()" << endl;
            m_pfile->writetofile(pcontent);
        }
        void readfromdb() override
        {
   
            cout << "LogAdapter::readfromdb() Adapter LogToFile::readfromdb()" << endl;
            m_pfile->readfromfile();
        }
        void closedb() override
        {
   
            cout << "LogAdapter::closedb() Adapter LogToFile::closedb()" << endl;
            m_pfile->closefile();
        }
    };
}

namespace ns4
{
   
    class LogToFile // 日志文件操作相关类
    {
   
    public:
        void initfile() {
   }                        // 做日志文件初始化工作,比如打开文件等等
        void writetofile(const char *pcontent) {
   } // 将日志内容写入文件
        void readfromfile() {
   }                    // 从日志中读取一些信息
        void closefile() {
   }                       // 关闭日志文件
    };

    class LogToDatabase
    {
   
    public:
        virtual ~LogToDatabase() {
   }

        virtual void initdb() = 0; // 不一定非是纯虚函数
        virtual void writetodb(const char *pcontent) = 0;
        virtual void readfromdb() = 0;
        virtual void closedb() = 0;
    };

    class LogAdapter : public LogToDatabase, private LogToFile // 类适配器,通过继承实现接口的适配
    {
   
    public:
        void initdb() override
        {
   
            cout << "LogAdapter::initdb() Adapter LogToFile::initfile()" << endl;
            initfile();
        }
        void writetodb(const char *pcontent) override
        {
   
            cout << "LogAdapter::writetodb() Adapter LogToFile::writetofile()" << endl;
            writetofile(pcontent);
        }
        void readfromdb() override
        {
   
            cout << "LogAdapter::readfromdb() Adapter LogToFile::readfromdb()" << endl;
            readfromfile();
        }
        void closedb() override
        {
   
            cout << "LogAdapter::closedb() Adapter LogToFile::closedb()" << endl;
            closefile();
        }
    };
}

int main()
{
   
#if 0
    using namespace ns1;
    shared_ptr<LogToFile> plog(new LogToFile());
    plog->initfile();
    plog->writetofile("Write a log to the log file"); // 写一条日志到日志文件中
    plog->readfromfile();
    plog->closefile();
#endif

#if 0
    using namespace ns2;
    shared_ptr<LogToDatabase> plogdb(new LogToDatabase());
    plogdb->initdb();
    plogdb->writetodb("Write a log to the database"); // 写一条日志到数据库中
    plogdb->closedb();
    plogdb->readfromdb();
#endif

#if 0
    using namespace ns3;
    //shared_ptr<LogToFile> plog2(new LogToFile());
    //shared_ptr<LogToDatabase> plogdb2(new LogAdapter(plog2));
    shared_ptr<LogToDatabase> plogdb2(new LogAdapter());
    plogdb2->initdb();
    plogdb2->writetodb("Writing a log to the database is actually writing a log to the log file");
    plogdb2->readfromdb();
    plogdb2->closedb();
#endif

#if 1
    using namespace ns4;
    shared_ptr<LogToDatabase> plogdb3(new LogAdapter());
    plogdb3->initdb();
    plogdb3->writetodb("Writing a log to the database is actually writing a log to the log file");
    plogdb3->readfromdb();
    plogdb3->closedb();
#endif

    cout << "Over!\n";
    return 0;
}

相关推荐

  1. C++经典设计模式15 适配器模式

    2023-12-11 09:20:04       30 阅读
  2. C++经典设计模式19 职责链模式

    2023-12-11 09:20:04       23 阅读
  3. C++经典设计模式18 备忘录模式

    2023-12-11 09:20:04       37 阅读
  4. C++经典设计模式16 桥接模式

    2023-12-11 09:20:04       27 阅读
  5. C++经典设计模式17 中介者模式

    2023-12-11 09:20:04       25 阅读
  6. C++经典设计模式12 状态模式

    2023-12-11 09:20:04       29 阅读
  7. C++经典设计模式11 组合模式

    2023-12-11 09:20:04       25 阅读
  8. C++经典设计模式10 迭代器模式

    2023-12-11 09:20:04       34 阅读
  9. C++经典设计模式22 总结

    2023-12-11 09:20:04       32 阅读
  10. C++经典设计模式1 介绍

    2023-12-11 09:20:04       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-11 09:20:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-11 09:20:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-11 09:20:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-11 09:20:04       20 阅读

热门阅读

  1. C++(14):获取类型在tuple中的索引

    2023-12-11 09:20:04       32 阅读
  2. TCP 和UDP 到底有啥区别

    2023-12-11 09:20:04       37 阅读
  3. 【数据结构】Treap

    2023-12-11 09:20:04       44 阅读
  4. https 加密协议

    2023-12-11 09:20:04       37 阅读
  5. TensorFlow 的基本概念和使用场景

    2023-12-11 09:20:04       40 阅读
  6. OkHttp: 使用入门

    2023-12-11 09:20:04       29 阅读
  7. PCIe中断总结-各个中断的区别

    2023-12-11 09:20:04       48 阅读
  8. 什么是漏洞扫描

    2023-12-11 09:20:04       36 阅读