前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)
工厂方法模式(二)
抽象工厂模式(一)
抽象工厂模式(二)
原型模式
外观模式
中介者模式
代理模式
装饰者模式
策略模式
状态模式
命令模式
建造者模式
桥接模式体现了对一个既有类进行扩展是的原则:除非有更好的理由采用继承的方式(有虚函数需要重新实现、有受保护成员需要访问),否则就采用组合的方式进行扩展。
Pimpl 惯用法:将类的接口和实现进行解耦,是桥接模式的一种特例。
#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;
};
#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);
}
};
#include
#include
using namespace std;
class LogHelperimpl
{
public:
virtual ~LogHelperimpl(){
}
virtual void saveLog(const string &message) = 0;
};
#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;
}
};
#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();
}