Является ли использование OnClickListener () примером шаблона стратегии? - PullRequest
0 голосов
/ 24 февраля 2019

Является ли OnClickListener в Android примером шаблона стратегии?В другом Stackoverflow вопрос принятый ответ говорит, что это шаблон наблюдателя.

Подобный код, чтобы понять вопрос.

public interface OnClickListener{
    void onClick(View view);
}

public class Button extends View{
    private OnClickListener listener;
    void clicked(){
        //some code
        if(listener != null){
            listener.onClick(this);
        }
        //some other code
    }
    public void setOnClickListener(OnClickListener listener){
        this.listener = listener;
    }
}

Мое рассуждение, чтобы полагать, что это шаблон стратегии, а не шаблон наблюдателя:

  1. Здесь мы видим Button классне имеет списка слушателей (наблюдателей), но может иметь только одного слушателя.
  2. Одновременно делегирует часть метода своему члену экземпляра: listener.
  3. OnClickListener аналогичен стратегии, в которой пользовательский код реализует стратегию (метод), вызываемую один раз кнопкой.
  4. Различные реализации OnClickListener могут быть переданы объекту Button во время выполнения, а поведение может быть изменено во время выполнения.(Та же кнопка при нажатии может показывать всплывающее окно с одной реализацией OnClickListener и может отправлять запрос на сервер, если пропущена другая реализация OnClickListener.)

1 Ответ

0 голосов
/ 25 февраля 2019

Вот намерение шаблона наблюдателя на стр. 293.

Определение зависимости один-ко-многим между объектами, чтобы при изменении состояния одного объекта все его зависимые элементы уведомлялись и обновлялись автоматически.

Строго говоря, пример кода не является Обозревателем, потому что отношение один ко многим скорее один к одному.Однако я бы не стал называть это также Стратегией, согласно ее намерению на стр. 315.

Определить семейство алгоритмов, инкапсулировать каждый из них и сделать их взаимозаменяемыми.Стратегия позволяет алгоритму варьироваться независимо от клиентов, которые его используют.

Семантически слушатель не является алгоритмом;т.е. реагирование на событие - это другая цель, нежели выполнение расчетов.Эта цель синтаксически проявляется, когда метод onClick() равен void и, следовательно, ведет себя больше как слушатель.

По этой причине я бы назвал пример кода вырожденной формой Observer.Шаблон.Для меня это похоже на попытку Обозревателя, которая не вполне соответствовала требованиям.Я бы не удостоил эту попытку попыткой связать ее с другим шаблоном.

...