2015-08-22 5 views
6

ecco la mia Interface Builder:Builder Design Pattern: Accesso alla/Passando dati del modello a/in classi calcestruzzo

public interface IContainerBuilder { 
    void SetSections(); 
    void SetSides(); 
    void SetArea(); 
    WebControl GetContainer(); 
} 

E questo è il mio ConcreteBuilder:

public class SingleContainerBuilder:BaseProperties, IContainerBuilder { 
    Panel panel = new Panel(); 
    public void SetSections() { 
    //panel.Height = value coming from model 
    //panel.Width = value coming from model 
    } 
    public void SetSides() { 
    //panel.someproperty = //value coming from model, 
    //panel.someotherproperty = //value coming from model, 
    } 
    public void SetArea() { 
    throw new NotImplementedException(); 
    } 
    public System.Web.UI.WebControls.WebControl GetContainer() { 
    return panel; 
    } 
} 

E il regista è qui:

public class ContainerBuilder { 
    private readonly IContainerBuilder objBuilder; 
    public Builder(IContainerBuilder conBuilder) { 
    objBuilder = conBuilder; 
    } 
    public void BuildContainer() { 
    objBuilder.SetArea(); 
    objBuilder.SetSections(); 
    objBuilder.SetSides(); 
    } 
    public WebControl GetContainer() { 
    return this.objBuilder.GetContainer(); 
    } 
} 

Ed è così che io chiamo dalla pagina di default:

var conBuilder = new ContainerBuilder(new SingleContainerBuilder()); 
conBuilder.BuildContainer(); 
var container = conBuilder.GetContainer(); 

Ora il problema/confusione che sto avendo è come passare i dati del modello alle classi concrete? La ragione per cui sono confuso/bloccato potrebbe essere il numero di contenitori diversi (potrebbe essere più di 20-30). Ogni diverso tipo di contenitore deve andare e prendere i dati dal modello o esiste un approccio migliore per questo?

La seconda cosa di cui sono confuso è che il mio modello si trova in una libreria diversa. Devo creare una copia del modello nel mio progetto web e popolare il mio modello locale da quel modello master, oppure devo interrogare direttamente il modello master per le proprietà della classe concreta? Come puoi vedere, il mio SingleContainer contiene BaseProperties, che sono la dichiarazione locale delle proprietà che sono già nel modello principale. Non vedo o capisco il punto della Model locale e non sono sicuro di essere qui o no.

Mi dispiace, sono nuovo di Design Patterns.

Qualsiasi aiuto sarà molto apprezzato,

Grazie

risposta

2

Ho creato una libreria chiamata prima dell'inizializzazione del builder, sto inviando la "chiave" del contenitore che ho bisogno al metodo statico della libreria e la libreria mi restituisce i dati che mi servono in base alla "chiave" e poi passo quell'oggetto al costruttore e faccio cose lì. Prima dovevo passare più oggetti per costruire ciò che era necessario per essere compilato, ma ora invece di passare più 'Oggetti dati' in classi concrete e fare in modo che le classi concrete dipendano da altre classi, le classi concrete hanno solo bisogno di un 'oggetto dati' che contiene tutte le informazioni ho bisogno.

Quindi il mio invito assomiglia a questo ora

var data = ContainerData.Getdata(key);//Call to library 

e poi l'ultima chiamata al costruttore è

var conBuilder = new ContainerBuilder(new SingleContainerBuilder(data)); 

Naturalmente il costruttore della classe concreta è stata modificata per accettare il tipo 'data'

0

@Does ogni diverso tipo di contenitore deve andare ei dati afferrare dal modello o c'è un approccio migliore per questo?

Come nel libro GOF descritto, questa sarebbe una soluzione solide. Quindi hai per ogni tipo diverso un tipo concreto di costruttore.

Una soluzione potrebbe essere quella di fornire specifiche dai modelli in modo da poter utilizzare un costruttore per un gruppo di modelli. Essere consapevoli: in questo modo i modelli devono conoscere i buidlers e questo non è un modo pulito!

@ Ogni diverso tipo di contenitore deve andare e prendere i dati dal modello oppure esiste un approccio migliore?

In nessun caso il contenitore deve conoscere direttamente i modelli. Il costruttore dovrebbe farlo. Ecco a cosa serve il costruttore patern. Quindi il costruttore dovrebbe sapere come ottenere i dati dal modello. Raccogliere i dati nel caso in cui è chiamato a costruire una parte.

prima parte della sua intenzione builder: "separare la costruzione di un oggetto complexe dalla sua rappresentazione in modo che lo stesso processo di costruzione può creare diversa rappresentazione"

@Do Ho bisogno di creare una copia del modello nel mio progetto web e popolare il mio modello locale da quel modello master o dovrei interrogare direttamente il modello master per le proprietà della classe concreta?

Non sono nel tuo progetto, ma penso piuttosto che non dovresti creare copie dei dati master che di solito sono soggetti all'arresto. Pertanto il costruttore dovrebbe avere la possibilità di valutare i dati necessari.

+0

Grazie per la risposta @ratnim. Sono d'accordo con la parte del modello. In realtà, ho seguito l'idea discussa qui [link] (http://stackoverflow.com/questions/696027/design-pattern-builder). L'idea di seguire l''oggetto dati' mi è sembrata una soluzione fattibile finora. Ma tengo aperta questa ricerca se c'è un approccio migliore là fuori che qualsiasi guru esperto sta usando e può guidarmi – Angloos