设计模式的 C++ 实现---桥接模式

前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)
工厂方法模式(二)
抽象工厂模式(一)
抽象工厂模式(二)
原型模式
外观模式
中介者模式
代理模式
装饰者模式
策略模式
状态模式
命令模式
建造者模式

前言

桥接模式体现了对一个既有类进行扩展是的原则:除非有更好的理由采用继承的方式(有虚函数需要重新实现、有受保护成员需要访问),否则就采用组合的方式进行扩展。
Pimpl 惯用法:将类的接口和实现进行解耦,是桥接模式的一种特例。

实现举例

  1. 场景描述
    假设一个简单的日志记录功能:日志可以分为错误日志和操作日志,不同类型的日志对记录的内容会有特定的处理;日志的保存可以是多样的,比如保存到文本文件、数据库文件等。
  2. 日志抽象基类
#include 
#include 
#include 
using namespace std;

class LogHelperimpl;
class LogHelper
{
     
public:
    LogHelper(shared_ptr<LogHelperimpl> &pimpl ):m_pimpl(pimpl){
     }
    virtual ~LogHelper(){
     }
    virtual void saveLog(const string &message) = 0;
protected:
    shared_ptr<LogHelperimpl> m_pimpl;
};
  1. 日志派生类
    ①.错误日志
#include "loghelper.h"
#include "loghelperimpl.h"

class ErrorLogHelper : public LogHelper
{
     
public:
    using LogHelper::LogHelper;
    void saveLog(const string &message) override
    {
     
       string dataStr = "<"+ QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss").toStdString()+">";
       string newMessage = dataStr+ "【错误日志】"+message;
       m_pimpl->saveLog(newMessage);
    }
};

②.操作日志

#include "loghelper.h"
#include "loghelperimpl.h"

class OperateLogHelper : public LogHelper
{
     
public:
    using LogHelper::LogHelper;
    void saveLog(const string &message) override
    {
     
       string dataStr = "<"+ QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss").toStdString()+">";
       string newMessage = dataStr+ "【操作日志】"+message;
       m_pimpl->saveLog(newMessage);
    }
};
  1. 日志实现抽象基类
#include 
#include 
using namespace std;

class LogHelperimpl
{
     
public:
    virtual ~LogHelperimpl(){
     }
    virtual void saveLog(const string &message) = 0;
};
  1. 日志实现派生类
    ①.保存到文本
#include "loghelperimpl.h"

class TextLogHelperimpl : public LogHelperimpl
{
     
public:
   TextLogHelperimpl(){
     }
   void saveLog(const string &message) override
   {
     
       cout << "***文本文件中保存日志***"<<endl;
       cout <<message<<endl;
       cout << "***文本文件中保存日志***"<<endl;
       cout << endl;
   }
};

②.保存到数据库

#include "loghelperimpl.h"

class DataBaseLogHelperimpl : public LogHelperimpl
{
     
public:
    DataBaseLogHelperimpl(){
     }
    void saveLog(const string &message) override
    {
     
        cout << "***数据库文件中保存日志***"<<endl;
        cout <<message<<endl;
        cout << "***数据库文件中保存日志***"<<endl;
        cout << endl;
    }
};

  1. 客户端调用
    设计模式的 C++ 实现---桥接模式_第1张图片
#include "errorloghelper.h"
#include "operateloghelper.h"
#include "textloghelperimpl.h"
#include "databaseloghelperimpl.h"

int main(int argc, char *argv[])
{
     
    QCoreApplication a(argc, argv);

    shared_ptr<LogHelperimpl> textlog(new TextLogHelperimpl());
    shared_ptr<LogHelper> errortotext(new ErrorLogHelper(textlog));
    errortotext->saveLog("对象创建出错");
    shared_ptr<LogHelper> operatetotext(new OperateLogHelper(textlog));
    operatetotext->saveLog("删除了记录");

    shared_ptr<LogHelperimpl> dblog(new DataBaseLogHelperimpl());
    shared_ptr<LogHelper> errortodb(new ErrorLogHelper(dblog));
    errortodb->saveLog("内存泄漏");
    shared_ptr<LogHelper> operatetodb(new OperateLogHelper(dblog));
    operatetodb->saveLog("添加了一条新记录");

    return a.exec();
}

你可能感兴趣的:(设计模式,设计模式,c++)