Нужен подходящий шаблон для Android

#java #android #design-patterns #hierarchy #superclass

#java #Android #дизайн-шаблоны #иерархия #суперкласс

Вопрос:

Я работаю над приложением для Android и столкнулся с проблемой рефакторинга; для большинства моих действий требуются определенные возможности уведомления, то есть отображение всплывающего сообщения. Это обрабатывается суперклассом, который расширяет активность

Активность

-NotificationActivity

—MyActivityA

—MyActivityB

и так далее. Затем я решил провести рефакторинг двух своих действий, в которых используется счетчик, заполняемый курсором базы данных. Иерархия теперь выглядит следующим образом:

Активность

-MyNotificationActivity

—MyActivityA

—MyActivityB

—MySpinnerActivity (настраивает счетчик и курсор)

—MySpinnerActivityA

—MySpinnerActivityB

Проблема, с которой я сталкиваюсь сейчас, заключается в следующем — я пишу новый класс Activity, который также будет использовать курсор базы данных, но для заполнения ListView. Я хотел бы расширить ListView, чтобы использовать встроенное в Android управление списками, но мне также нужен доступ к методам настройки курсора и методам уведомлений, которые уже существуют в моей иерархии классов.

Я действительно стремлюсь избежать дублирования кода. Есть предложения?

Приветствую, Барри

Комментарии:

1. Просто подумал — я мог бы попробовать, чтобы мой суперкласс NotificationActivity расширял ListActivity, а не Activity. Не очень «приятный», хотя ни одному из моих других действий не нужен список.

Ответ №1:

При решении аналогичной проблемы (куча действий, которые показывают ProgressDialogs), я избегал расширения суперкласса функциональностью ProgressDialog.

Вместо этого я написал отдельный класс «LoadingDialog», чтобы справиться с этим. В каждом действии, которому требовалась эта функциональность, у него был бы экземпляр класса LoadingDialog в качестве поля. И для любой функциональности, зависящей от контекста или действия, действие может передавать ссылку на себя или предоставлять другие части самого себя по мере необходимости.

В вашем случае, возможно, вы могли бы написать какой-нибудь «ToasterFunctionClass», который инкапсулирует общую функциональность, и иметь его экземпляр в каждом из соответствующих действий.

 public class ListStuff extends ListActivity {

    private ToastFunctionClass toaster = new ToastFunctionClass(this); //pass yourself so that toaster has a Context in which to do UI stuff.

    onSomethingHappened() {
        toaster.showToast("Something happened");
    }

}