インタビュアー:アダプターモードについて話してください
クラスのインターフェースを、顧客が望む別のインターフェースに変換します。 アダプターモードでは、互換性のないインターフェイスを持つクラスが連携できます
モデルの利点
- ターゲットクラスとアダプタクラスを分離します
- クラスの透明性と再利用性の向上
- 柔軟性とスケーラビリティは非常に優れています
モデルの欠点
- クラスアダプタは、一度に1つのアダプタにしか適応できず、アダプタを最終クラスにすることはできません。ターゲット抽象クラスは、クラスではなく、インターフェイスのみにすることができます。
- アダプタークラスをアダプター内のオブジェクトアダプターに置き換える方法は面倒です
該当する環境
システムは既存のクラス(アダプター)を使用する必要があり、これらのクラスのインターフェースはシステムのニーズを満たしていません。また、これらのクラスのソースコードがなくても、および
の再利用可能なクラス(ターゲットクラス/アダプター)を作成します。将来導入される可能性のあるいくつかのクラスを含め、互いにあまり関連性のないいくつかのクラスは連携して機能します
アダプターモードコード
クラスアダプター
/*
* @ Description: C++ Design Patterns___Adapter(Class scope)
* @ version: v1.0
* @ Author: WeissxJ
*/
#include<iostream>
class Target
{
public:
virtual ~Target();
virtual void request()=0;
//...
};
class Adaptee
{
public:
~Adaptee(){
}
void specificRequest(){
std::cout<<"specific request"<<std::endl;
}
// ...
};
class Adapter :public Target,private Adaptee
{
public:
virtual void request(){
specificRequest();
}
//...
};
int main(){
Target *t=new Adapter();
t->request();
delete t;
return 0;
}
オブジェクトアダプター
/*
* @ Description: C++ Design Patterns___Adapter(Object scope)
* @ version: v1.0
* @ Author: WeissxJ
*/
#include<iostream>
class Target
{
public:
virtual ~Target();
virtual void request()=0;
//...
};
class Adaptee
{
public:
~Adaptee(){
}
void specificRequest(){
std::cout<<"specific request"<<std::endl;
}
// ...
};
class Adapter :public Target
{
public:
Adapter():adaptee(){
}
~Adapter(){
delete adaptee;
}
void request(){
adaptee->specificRequest();
//...
}
//...
private:
Adaptee *adaptee;
// ...
};
int main(){
Target *t=new Adapter();
t->request();
delete t;
return 0;
}