適配器模式解決現有接口與目標接口不兼容問題,允許不兼容的類協同工作。例如,當新系統需要使用不同接口訪問舊數據庫時,適配器模式通過創建適配器類實現目標接口,并持有現有類引用,將新請求轉換為舊請求。1. 提高類復用性;2. 增加透明度,客戶端無需知曉適配器;3. 符合開閉原則。缺點包括增加系統復雜性和可能的實現難度。適配器模式不同于橋接模式,后者用于解耦抽象與實現,而非接口轉換。
c++適配器模式主要解決的是現有接口與目標接口不兼容的問題,它允許不兼容的類可以一起工作。實際應用中,例如你有一個舊的數據庫訪問類,但新的系統需要使用一種不同的接口來訪問數據庫,這時適配器模式就派上用場了。
解決方案:
適配器模式的核心在于創建一個適配器類,這個類實現了目標接口,并且內部包含一個對現有類的引用。適配器類負責將目標接口的請求轉換為現有類的請求,從而使得現有類可以被新的系統所使用。
立即學習“C++免費學習筆記(深入)”;
// 現有類,接口不兼容 class OldDatabase { public: void oldQuery(const std::string& query) { std::cout << "Old Database Query: " << query << std::endl; } }; // 目標接口 class TargetInterface { public: virtual void newQuery(const std::string& query) = 0; }; // 適配器類 class DatabaseAdapter : public TargetInterface { public: DatabaseAdapter(OldDatabase* db) : oldDb(db) {} void newQuery(const std::string& query) override { // 將新的查詢請求轉換為舊的查詢請求 oldDb->oldQuery(query); } private: OldDatabase* oldDb; }; int main() { OldDatabase* oldDb = new OldDatabase(); DatabaseAdapter* adapter = new DatabaseAdapter(oldDb); // 使用適配器來調用舊的數據庫 adapter->newQuery("SELECT * FROM users"); delete oldDb; delete adapter; return 0; }
為什么要使用適配器模式?
適配器模式的主要目的是復用現有的代碼,同時滿足新的接口需求。如果不使用適配器模式,可能需要修改現有的代碼,這可能會引入新的bug,或者需要重寫大量的代碼。適配器模式提供了一種更加優雅和可維護的解決方案。
適配器模式的優缺點是什么?
優點:
- 提高了類的復用性。
- 增加了類的透明度,客戶端不需要知道適配器的存在。
- 符合開閉原則,可以在不修改現有代碼的情況下引入新的適配器。
缺點:
- 可能會增加系統的復雜性,因為需要引入新的適配器類。
- 在某些情況下,適配器的實現可能會比較復雜,特別是當現有接口和目標接口差異很大時。
適配器模式與橋接模式有什么區別?
適配器模式和橋接模式都是結構型模式,但是它們解決的問題不同。適配器模式主要解決的是接口不兼容的問題,而橋接模式主要解決的是類的繼承結構膨脹的問題。橋接模式將抽象部分和實現部分分離,使得它們可以獨立變化,而適配器模式則是將一個類的接口轉換成另一個類的接口。簡單來說,橋接模式是“解耦”,適配器模式是“轉換”。