Entrevistador: Fale sobre o modo do adaptador
Converta a interface de uma classe em outra interface desejada pelo cliente. O modo adaptador permite que classes com interfaces incompatíveis trabalhem juntas
Vantagens do modelo
- Desacople a classe de destino e a classe do adaptador
- Maior transparência de classe e capacidade de reutilização
- Flexibilidade e escalabilidade são muito boas
Desvantagens do modelo
- Um adaptador de classe só pode se adaptar a um adaptador por vez, e o adaptador não pode ser a classe final. A classe abstrata de destino só pode ser uma interface, não uma classe
- O método de substituição da classe do adaptador pelo adaptador de objeto no adaptador é problemático
Ambiente aplicável
O sistema precisa usar as classes existentes (adaptador), e as interfaces dessas classes não atendem às necessidades do sistema, e mesmo sem o código-fonte dessas classes,
crie uma classe reutilizável (classe de destino / adaptador) para e Algumas classes que não são muito relacionadas entre si, incluindo algumas classes que podem ser introduzidas no futuro, funcionam juntas
Código do modo adaptador
Adaptador de classe
/*
* @ 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;
}
Adaptador de objeto
/*
* @ 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;
}