設計模式之適配器模式(學習筆記)
定義
適配器模式是一種結構型設計模式,它允許將一個類的接口轉換為客戶端希望的另一個接口。適配器使得原本由于接口不兼容而不能一起工作的類可以協同工作。通過創建適配器類,可以將現有類的接口轉換成目標接口,從而使這些類能夠在一起工作。
為什么使用適配器模式
-
兼容性
-
適配器模式能夠解決由于接口不兼容而無法直接協作的問題,使得現有的類能夠在新系統中復用。
-
代碼重用
-
適配器模式允許在不修改現有代碼的情況下,將其整合到新的代碼結構中,實現代碼的重用。
-
靈活性
-
通過適配器,可以在運行時動態地轉換接口,增強了系統的靈活性和擴展性。
適配器模式的實現步驟
-
目標接口
-
定義客戶端所期望的接口,即目標接口。
-
現有接口
-
定義一個已經存在的類,它的接口與目標接口不兼容。
-
適配器類
-
對象適配器
-
繼承目標接口,通過組合持有現有類的實例,并在實現目標接口的方法中調用現有類的方法,實現接口轉換。
-
類適配器
-
繼承目標接口并同時繼承現有類,通過覆蓋現有類的方法來實現接口轉換。
優缺點和適用場景
優點
-
兼容性
-
可以使得不兼容的接口一起工作,解決了接口不兼容的問題。
-
代碼重用
-
可以在不修改現有類的情況下使用這些類,實現代碼重用。
-
靈活性
-
可以動態地改變接口的實現,增強系統的靈活性和擴展性。
缺點
-
復雜性增加
-
需要額外編寫適配器類,增加了系統的復雜性。
-
性能開銷
-
適配器模式會增加一個額外的層次,可能會帶來一定的性能開銷。
適用場景
-
接口轉換
-
當現有類的接口與目標接口不兼容時,可以使用適配器模式進行接口轉換。
-
遺留系統整合
-
在整合遺留系統時,可以使用適配器模式將現有系統的接口轉換為新系統所需的接口。
-
第三方庫整合
-
當需要使用第三方庫的類,而這些類的接口與系統不兼容時,可以使用適配器模式。
例子:使用適配器模式將舊系統的接口轉換為新系統的接口
#include <iostream> #include <memory> #include <string> // 目標接口:新的日志接口 class Logger { public: virtual ~Logger() {} virtual void logMessage(const std::string& message) const = 0; }; // 現有接口:舊的日志系統 class OldLogger { public: void writeLog(const std::string& msg) const { std::cout << "Old Logger: " << msg << std::endl; } }; // 對象適配器類:將舊的日志系統適配為新的日志接口 class LoggerAdapter : public Logger { private: std::shared_ptr<OldLogger> oldLogger; public: LoggerAdapter(std::shared_ptr<OldLogger> oldLogger) : oldLogger(oldLogger) {} void logMessage(const std::string& message) const override { oldLogger->writeLog(message); } }; // 類適配器類:將舊的日志系統適配為新的日志接口 class ClassLoggerAdapter : public Logger, private OldLogger { public: void logMessage(const std::string& message) const override { writeLog(message); } }; int main() { // 使用舊的日志系統 std::shared_ptr<OldLogger> oldLogger = std::make_shared<OldLogger>(); oldLogger->writeLog("Logging with the old logger"); // 使用對象適配器將舊的日志系統適配為新的日志接口 std::shared_ptr<Logger> logger = std::make_shared<LoggerAdapter>(oldLogger); logger->logMessage("Logging with the object adapter"); // 使用類適配器將舊的日志系統適配為新的日志接口 std::shared_ptr<Logger> classLogger = std::make_shared<ClassLoggerAdapter>(); classLogger->logMessage("Logging with the class adapter"); return 0; }

浙公網安備 33010602011771號