Java - Каким будет правильный дизайн / шаблон дизайна для этого случая? - PullRequest
0 голосов
/ 13 июня 2018

Мне нужно прослушать событие из класса, генерирующего событие;например click.В настоящее время у меня есть класс, который обрабатывает события из класса, генерирующего события, как это.

someclass.clickedOnItem1()
someclass.clickedOnItem2()

, где someclass равен

class Someclass {
   //functions clickedOnItem1() and clickedOnItem2()
}

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

1 Ответ

0 голосов
/ 13 июня 2018

Это не ответит на вопрос что такое шаблон проектирования , но только с учетом концепций ООП: вы можете использовать абстракцию в SomeClass и:

  • Объявить абстрактные методы дляполучить специфику от конкретных классов
  • Завершить методы точки входа (обработки событий) в SomeClass, чтобы заморозить принятие решений на основе заданной подклассом конкретной конфигурации.Это важно, чтобы подклассы не пропускали логику, которую вы хотите контролировать в суперклассе.

SomeClass может выглядеть так:

abstract class Someclass {
    final void clickedOnItem1(){
        if(this.getConcreteOption()) {
             //do if concreteOption
        }

        this.performClickOnItem1Action();
    }

    void performClickOnItem1Action() {

    }

    abstract boolean getConcreteOption();
}

Это заставит подклассы предоставлять определенныеconfig, сохраняя контроль над потоком в суперклассе, и в то же время позволяя конкретным классам переопределять поведение.

Подклассы могут выглядеть следующим образом:

class SomeclassA {
    void performClickOnItem1Action() {
        //overriding this...
    }

    boolean getConcreteOption() {
        return true;//or false
    }
}

class SomeclassB {
    boolean getConcreteOption() {
        return true;//or false
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...