Attualmente sto lavorando su una libreria Android che crea una finestra di dialogo che consente di selezionare i colori da una tavolozza (esempi alla fine) e mi sono imbattuto in un interessante problema di progettazione.
Per creare l'oggetto di dialogo, ho deciso di utilizzare Builder Pattern
. Uno dei metodi sull'oggetto Builder
è .useMaterial(value)
, dove value
è un booleano.
Ciò che useMaterial(true)
fa è impostare il codice per utilizzare il builder da android .support.v7.app.AlertDialog.Builder , altrimenti il builder da android.app .AlertDialog.Builder viene utilizzato.
Il metodo chiama entrambi i costruttori sono esattamente gli stessi . Ecco il codice che si occupa del problema ( useMaterial
è un valore booleano che specifica quale build utilizzare):
if (useMaterialDialog) {
return createMaterialDialog(activity, view);
}
else {
return createDefaultDialog(activity, view);
}
E i due metodi:
private android.support.v7.app.AlertDialog createMaterialDialog(Context context, View view) {
android.support.v7.app.AlertDialog.Builder alertDialogBuilder =
new android.support.v7.app.AlertDialog.Builder(context);
alertDialogBuilder
.setTitle(titleResId)
.setView(view);
// Add positve and negative buttons to dialog, if needed
if (showOkCancelButtons) {
alertDialogBuilder.setPositiveButton(R.string.dialog_positive_button_text, onOkPressedListener)
.setNegativeButton(R.string.dialog_negative_button_text, onCancelPressedListener);
}
return alertDialogBuilder.create();
}
private android.app.AlertDialog createDefaultDialog(Context context, View view) {
android.app.AlertDialog.Builder alertDialogBuilder =
new android.app.AlertDialog.Builder(context);
alertDialogBuilder
.setTitle(titleResId)
.setView(view);
// Add positve and negative buttons to dialog, if needed
if (showOkCancelButtons) {
alertDialogBuilder.setPositiveButton(R.string.dialog_positive_button_text, onOkPressedListener)
.setNegativeButton(R.string.dialog_negative_button_text, onCancelPressedListener);
}
return alertDialogBuilder.create();
}
Ora nota, entrambi i metodi hanno il codice duplicato l'unico posto in cui differiscono è la prima riga, cioè dove viene deciso il tipo dell'oggetto costruttore.
Questo approccio mi ha costretto a definire onOkPressedListener
e onCancelPressedListener
come variabili membro, per evitare un'ulteriore duplicazione del codice.
Ho pensato di utilizzare State Pattern
, ma sembra essere eccessivo, poiché aggiungerebbe troppo codice, poiché l'attività è piuttosto semplice.
Quale sarebbe l'approccio corretto qui?
P.S. Di seguito sono riportati gli esempi delle "finestre di dialogo" menzionate nella domanda:
Non-materiale (quando useMaterial
è false
)
Materiale(quandouseMaterial
ètrue
)