定義 適配器模式是一種結構型設計模式,它允許將一個類的介面轉換為客戶端希望的另一個介面。適配器使得原本由於介面不相容而不能一起工作的類可以協同工作。通過創建適配器類,可以將現有類的介面轉換成目標介面,從而使這些類能夠在一起工作。 為什麼使用適配器模式 相容性 適配器模式能夠解決由於介面不相容而無法直 ...
定義
適配器模式是一種結構型設計模式,它允許將一個類的介面轉換為客戶端希望的另一個介面。適配器使得原本由於介面不相容而不能一起工作的類可以協同工作。通過創建適配器類,可以將現有類的介面轉換成目標介面,從而使這些類能夠在一起工作。為什麼使用適配器模式
-
相容性
- 適配器模式能夠解決由於介面不相容而無法直接協作的問題,使得現有的類能夠在新系統中復用。
-
代碼重用
- 適配器模式允許在不修改現有代碼的情況下,將其整合到新的代碼結構中,實現代碼的重用。
-
靈活性
- 通過適配器,可以在運行時動態地轉換介面,增強了系統的靈活性和擴展性。
適配器模式的實現步驟
-
目標介面
- 定義客戶端所期望的介面,即目標介面。
-
現有介面
- 定義一個已經存在的類,它的介面與目標介面不相容。
-
適配器類
-
對象適配器
- 繼承目標介面,通過組合持有現有類的實例,併在實現目標介面的方法中調用現有類的方法,實現介面轉換。
-
類適配器
- 繼承目標介面並同時繼承現有類,通過覆蓋現有類的方法來實現介面轉換。
優缺點和適用場景
優點
-
相容性
- 可以使得不相容的介面一起工作,解決了介面不相容的問題。
-
代碼重用
- 可以在不修改現有類的情況下使用這些類,實現代碼重用。
-
靈活性
- 可以動態地改變介面的實現,增強系統的靈活性和擴展性。
缺點
-
複雜性增加
- 需要額外編寫適配器類,增加了系統的複雜性。
-
性能開銷
- 適配器模式會增加一個額外的層次,可能會帶來一定的性能開銷。
適用場景
-
介面轉換
- 當現有類的介面與目標介面不相容時,可以使用適配器模式進行介面轉換。
-
遺留系統整合
- 在整合遺留系統時,可以使用適配器模式將現有系統的介面轉換為新系統所需的介面。
-
第三方庫整合
- 當需要使用第三方庫的類,而這些類的介面與系統不相容時,可以使用適配器模式。
例子:使用適配器模式將舊系統的介面轉換為新系統的介面
#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; }