适配器模式
定义
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ——《设计模式》GoF
背景
日志系统,原来是通过写磁盘的方式进行存储,后来因为查询不便,需要额外添加往数据库写日志的功能(写文件和数据库并存);
代码
#include <string> #include <vector> using namespace std; class LogSys { public: LogSys() {} void WriteLog(const vector<string> &) { // ... 日志id 时间戳 服务器id 具体日志内容 roleid } vector<string>& ReadLog() { // ... vector<string> data /* = ...*/; return data; } }; class DB; // 面向接口编程 而不是具体类 强依赖 耦合性高 mysql mongo class LogSysEx : public LogSys { public: LogSysEx(DB *db) : _db(db) {} void AddLog(const vector<string> &data) { LogSys::WriteLog(data); /* 这里调用 _db 的方法将 data 数据存储到数据库 */ } void DelLog(const int logid) { vector<string>& data = LogSys::ReadLog(); // 从 vector<string> 中删除 logid的日志 LogSys::WriteLog(data); // 调用 _db 的方法将 logid的日志删除 } void UpdateLog(const int logid, const string &udt) { vector<string>& data = LogSys::ReadLog(); // 从 vector<string> 中更新 logid的日志 udt LogSys::WriteLog(data); // 调用 _db 的方法将 logid的日志更改 } string& LocateLog(const int logid) { vector<string>& data = LogSys::ReadLog(); string log1 /* = from log file*/; string log2 /* = from db */; string temp = log1 + ";" + log2; return temp; } private: DB* _db; };
要点
原来的接口是稳定的,新的外来的需求是变化的,那么可以通过继承原来的接口,让原来的接口继续保持稳定,在子类通过组合的方式来扩展功能;
本质
转换匹配,复用功能;
结构图