C# Language
Modelli di progettazione strutturale
Ricerca…
introduzione
I modelli di progettazione strutturale sono schemi che descrivono come gli oggetti e le classi possono essere combinati e formare una struttura di grandi dimensioni e che facilitano la progettazione identificando un modo semplice per realizzare relazioni tra entità. Ci sono sette modelli strutturali descritti. Sono i seguenti: Adattatore, Ponte, Composito, Decoratore, Facciata, Peso mosca e Proxy
Modello di disegno dell'adattatore
"Adapter" come suggerisce il nome è l'oggetto che consente a due interfacce reciprocamente incompatibili di comunicare tra loro.
Ad esempio: se acquisti un Iphone 8 (o qualsiasi altro prodotto Apple) hai bisogno di molti adattatori. Perché l'interfaccia predefinita non supporta l'audio jac o USB. Con questi adattatori puoi usare gli auricolari con fili o puoi usare un normale cavo Ethernet. Quindi "due interfacce reciprocamente incompatibili comunicano tra loro" .
Quindi in termini tecnici ciò significa: Convertire l'interfaccia di una classe in un'altra interfaccia che i clienti si aspettano. L'adattatore consente alle classi di funzionare insieme che non potrebbero altrimenti a causa di interfacce incompatibili. Le classi e gli oggetti che partecipano a questo modello sono:
Il modello dell'adattatore esclude 4 elementi
- ITarget: questa è l'interfaccia che viene utilizzata dal client per ottenere funzionalità.
- Adaptee: questa è la funzionalità che il cliente desidera, ma la sua interfaccia non è compatibile con il client.
- Cliente: questa è la classe che vuole ottenere alcune funzionalità utilizzando il codice dell'adaparte.
- Adapter: questa è la classe che implementerebbe ITarget e chiamerebbe il codice Adaptee che il client desidera chiamare.
UML
Primo esempio di codice (esempio teorico) .
public interface ITarget
{
void MethodA();
}
public class Adaptee
{
public void MethodB()
{
Console.WriteLine("MethodB() is called");
}
}
public class Client
{
private ITarget target;
public Client(ITarget target)
{
this.target = target;
}
public void MakeRequest()
{
target.MethodA();
}
}
public class Adapter : Adaptee, ITarget
{
public void MethodA()
{
MethodB();
}
}
Esempio di secondo codice (Real world imlementation)
/// <summary>
/// Interface: This is the interface which is used by the client to achieve functionality.
/// </summary>
public interface ITarget
{
List<string> GetEmployeeList();
}
/// <summary>
/// Adaptee: This is the functionality which the client desires but its interface is not compatible with the client.
/// </summary>
public class CompanyEmplyees
{
public string[][] GetEmployees()
{
string[][] employees = new string[4][];
employees[0] = new string[] { "100", "Deepak", "Team Leader" };
employees[1] = new string[] { "101", "Rohit", "Developer" };
employees[2] = new string[] { "102", "Gautam", "Developer" };
employees[3] = new string[] { "103", "Dev", "Tester" };
return employees;
}
}
/// <summary>
/// Client: This is the class which wants to achieve some functionality by using the adaptee’s code (list of employees).
/// </summary>
public class ThirdPartyBillingSystem
{
/*
* This class is from a thirt party and you do'n have any control over it.
* But it requires a Emplyee list to do its work
*/
private ITarget employeeSource;
public ThirdPartyBillingSystem(ITarget employeeSource)
{
this.employeeSource = employeeSource;
}
public void ShowEmployeeList()
{
// call the clietn list in the interface
List<string> employee = employeeSource.GetEmployeeList();
Console.WriteLine("######### Employee List ##########");
foreach (var item in employee)
{
Console.Write(item);
}
}
}
/// <summary>
/// Adapter: This is the class which would implement ITarget and would call the Adaptee code which the client wants to call.
/// </summary>
public class EmployeeAdapter : CompanyEmplyees, ITarget
{
public List<string> GetEmployeeList()
{
List<string> employeeList = new List<string>();
string[][] employees = GetEmployees();
foreach (string[] employee in employees)
{
employeeList.Add(employee[0]);
employeeList.Add(",");
employeeList.Add(employee[1]);
employeeList.Add(",");
employeeList.Add(employee[2]);
employeeList.Add("\n");
}
return employeeList;
}
}
///
/// Demo
///
class Programs
{
static void Main(string[] args)
{
ITarget Itarget = new EmployeeAdapter();
ThirdPartyBillingSystem client = new ThirdPartyBillingSystem(Itarget);
client.ShowEmployeeList();
Console.ReadKey();
}
}
Quando usare
- Consentire a un sistema di utilizzare classi di un altro sistema che non è compatibile con esso.
- Consentire la comunicazione tra sistemi nuovi e già esistenti che sono indipendenti l'uno dall'altro
- Ado.Net SqlAdapter, OracleAdapter, MySqlAdapter sono il miglior esempio di Adapter Pattern.