Entrevistador: hable sobre el modo adaptador
Convierta la interfaz de una clase en otra interfaz que desee el cliente. El modo adaptador permite que las clases con interfaces incompatibles trabajen juntas
Ventajas del modelo
- Desacoplar la clase de destino y la clase de adaptador
- Mayor transparencia y reutilización de clases
- La flexibilidad y la escalabilidad son muy buenas
Desventajas del modelo
- Un adaptador de clase solo puede adaptarse a un adaptador a la vez, y el adaptador no puede ser la clase final. La clase abstracta de destino solo puede ser una interfaz, no una clase
- El método de reemplazar la clase de adaptador con el adaptador de objeto en el adaptador es problemático
Entorno aplicable
El sistema necesita utilizar clases existentes (adaptadores), y las interfaces de estas clases no satisfacen las necesidades del sistema, e incluso sin el código fuente de estas clases,
crear una clase reutilizable (clase de destino / adaptador) para y Algunas clases que no están muy relacionadas entre sí, incluidas algunas clases que pueden introducirse en el futuro, funcionan juntas
Código de modo de adaptador
Adaptador de clase
/*
* @ 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;
}