Costruttori di finestre di dialogo di avviso astratto (stesse chiamate di metodo, oggetti diversi)

1

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)

    
posta Illya Gerasymchuk 27.08.2015 - 06:41
fonte

0 risposte

Leggi altre domande sui tag