文章目錄
- 一、前言
- 二、對于接口的討論
- 三、實現
- 1、對象適配器
- 1.1 UML類圖
- 1.2 實現
- 2、類適配器
- 四、最后
一、前言
從適配器模式開始就是類的組合聚合,類與類之間結構性的問題了。
- 適配器模式解決的問題: 適配器模式能夠在不破壞現有系統結構的情況下,使得不兼容的接口可以協同工作
相關代碼可以在這里,如有幫助給個star!AidenYuanDev/design_patterns_in_modern_Cpp_20
二、對于接口的討論
可能會有以下兩種情況:
- 兩個接口都有抽象父類
- 沒有抽象父類
不知道大家怎么樣,我當時從網上看實現方案真是千奇百怪,當然現在才發現是有沒有抽象父類的問題!🥸
哪這個影響嘛?🤔
答案嘛不影響。
知道適配器怎么加上的你就明白了!
適配器:是B_Base的子類,關聯A(成員函數)
具體的A轉化為B的接口,所以A有沒有抽象都無所謂,最后適配器的工作是把具體的A轉換成B_Base
三、實現
由于上面兩種情況都一樣,所以作者實現第二種,簡單點。🫠
1、對象適配器
對象適配器通過組合被適配者對象來實現適配器模式,適配器類實現目標接口,并在內部持有一個被適配者對象的實例
優點:
- 靈活性: 對象適配器使用組合關系,因此可以適配多個不同的被適配者對象,且可以在運行時動態改變適配者對象。
缺點
- 更多的對象間交互: 可能會導致系統中對象數量增加,復雜度增加。
1.1 UML類圖
1.2 實現
#include <iostream>
using namespace std;
class A {int a;
public:A(int a) : a(a) {}void show() {cout << "接口A:" << a << endl;}
};class B_Base {
public:virtual void showB() = 0;
};class B : public B_Base {int b;
public:void showB() {cout << "接口B:" << b << endl;}
};class Adapter : public B_Base {A* a_instance;
public:Adapter(A* a_instance) : a_instance(a_instance) {}// 轉換成:接口B包裹接口A的形式void showB() override {cout << "接口B:"; // 轉換成 接口B a_instance->show();}
};int main() {A* a_instance = new A(5);Adapter* adapter = new Adapter(a_instance);adapter->showB();return 0;
}
2、類適配器
不推薦用這個。偶然間看到了,而且《C++20設計模式》中沒有寫這個。可能是缺點太明顯了把!😑
缺點:
1.會出現二義性: 由于繼承多個類,可能會出現二義性
2. 無法適配被適配者類的子類: 如果被適配者類有子類,且希望適配器也能適配這些子類,類適配器不太適合,因為它固定了適配器與被適配者類的繼承關系。
3. 需求不靈活: 由于適配器與被適配者類的綁定關系是靜態的,無法在運行時動態改變適配器的行為。
這里就不寫了,困啦,而且也不常用。具體就是適配器同時繼承接口A及接口B
四、最后
如有幫助,點個贊把!創作不易!!!😭