Ho un modello di dati gerarchico e sto cercando di implementare le loro operazioni CRUD nella mia applicazione Web.
Attualmente ho ereditarietà di codice per le operazioni CRUD delle mie entità (risorse) come segue:
ResourceCommonProcedures come classe base e ogni procedura risorsa eredita la classe base.
public class ResourceCommonProcedures {
public Response create(Request request){
Response response = new Response();
int resType = this.getResourceType(request);
ResourceCommonProcedures rp = getResourceController(resType);
response = rp.create(request);
return response;
}
private ResourceCommonProcedures getResourceController(int resourceType){
//..
switch(resourceTypeName){
case Resource1:
return new R1Procedures();
case Resource2:
return new R2Procedures();
case Resource3:
return new R3Procedures();
...............
}
}
Class R1Procedures extends ResourceCommonProcedures{
public Response create(Request request) {
Response response = new Response();
Resource1 resource = (Resource1) request.getContent();
...........
// Converts DB structure to JPA
R1Converter r1Converter = new R1Converter();
Resource1JPA resourceJpa = r1Converter.toJPA(resource);
dao.persist();
return response;
}
}
Class R2Procedures extends ResourceCommonProcedures{
public Response create(Request request) {
Response response = new Response();
Resource1 resource = (Resource2) request.getContent();
// SOME RESOURCE 2 SPECIFIC CODE
...........
// Converts DB structure to JPA
R2Converter r2Converter = new R2Converter();
Resource2JPA resourceJpa = r2Converter.toJPA(resource);
dao.persist();
return response;
}
Quindi attualmente la base ha il codice del controller che decide quale metodo di sottocategoria deve essere chiamato.
Quindi il client chiamerà il metodo di creazione della classe base, che otterrà internamente la classe di implementazione e chiamerà il metodo di creazione specifico.
Questo design è abbastanza buono ??
O il getResourceController()
deve essere estratto dalla classe base e inserito in una classe separata ??
Esiste un modello di design specifico per il caso ??