2016-04-26 5 views
1

Ich habe eine Java-Controller-Klasse, wenn je Speichern Aktion aufgerufen wird in jedem Artikel sagen, Produkt oder Abdeckung oder Limit, ruft es die Controller-Save-Methode und ein Parameter wird übergeben. Die if-Logik im Controller überprüft das Argument und ruft die Speichermethode des entsprechenden Objekts auf. Die if-Logik wird von Tag zu Tag größer. Kann jemand besseres Entwurfsmuster vorschlagen?Wie reduziere ich, wenn sonst Dschungel von meinem Controller?

Code:

public class Product { 
public void save(PolicyData p){ 
    //logic here 
} 
} 

public class Coverage { 
    public void save(PolicyData p){ 
     //logic here 
    } 
} 

public class Limit { 
    public void save(PolicyData p){ 
     //logic here 
    } 
} 

public class Controller { 

    private Product pr=new Product(); 
    private Limit lim=new Limit(); 
    private Coverage cov=new Coverage(); 


    public void save(PolicyData p,String item){ 
    if(item.equals("Product")){ 
     pr.save(p); 
    }if(item.equals("Coverage")){ 
     cov.save(p); 
    }if(item.equals("Limit")){ 
     lim.save(p); 
    } 
    } 
} 
+9

A "Speicherbare" Schnittstelle und ein 'Map ' funktionieren würde. –

+0

Fragen wie diese gehören hier http://codereview.stackexchange.com/ – Michal

Antwort

1
  1. eine Schnittstelle erstellen, die Methode speichern
  2. die Methode in Ihrem Objekt implementieren hat
  3. In Ihrem Controller eine Karte erstellen zu halten Objekte gegen den Schlüssel, den Sie jetzt in Ihrem if
vergleichen

Code:

public interface Myinterface { 
public void save(PolicyData p); 
} 

public class Product implements Myinterface{ 
public void save(PolicyData p){ 
    //logic here 
} 


public class Controller { 


    private static HashMap<String,Myinterface> map=new HashMap<String,Myinterface>(); 

    public Controller(){ 
     map.put("Product", new Product()); 
     map.put("Limit", new Limit()); 
     map.put("Coverage", new Coverage()); 
    } 

    public void save(PolicyData p,String item){ 
    Myinterface m=map.get(item); 
    m.save(p); 
    } 
} 
    } 
+1

Es gibt einen Fehler im Konstruktor, Sie möchten nicht drei Elemente mit "Product" Schlüssel setzen. – Michal

4

erstellen speicherbar Schnittstelle:

public interface Saveable { 
    public void save(String p); 
} 

Ihre Klassen die Schnittstelle implementieren, und dann eine Karte erstellen:

private Map<String, Saveable> saveMap = new HashMap<>(); 

Füllen Sie es mit Speicherbare Objekte und Rufen Sie dann die Speichermethode basierend auf der Zeichenfolge auf.

public enum SaveableType { 
    PRODUCT, COVERAGE, LIMIT 
} 

public class Controller { 
    private Product pr = new Product(); 
    private Limit lim = new Limit(); 
    private Coverage cov = new Coverage(); 
    private Map<SaveableType, Saveable> saveableMap = new HashMap<>(); 

    public Controller() { 
     saveableMap.put(SaveableType.PRODUCT, pr); 
     saveableMap.put(SaveableType.LIMIT, lim); 
     saveableMap.put(SaveableType.COVERAGE, cov); 

    } 

    // better to use enum for the 2nd parameter not a String 
    public void save(PolicyData p, String item) { 
     SaveableType saveables = SaveableType.valueOf(item.toUpperCase()); 
     saveableMap.get(saveables).save(p); 
    } 
}