Объединение метода get с методом Register Observer - PullRequest
0 голосов
/ 08 июня 2011

Я пишу приложение, которое использует шаблон наблюдателя.Класс клиента должен знать, когда изменяется состояние объекта Employee.Также необходимо знать состояние сотрудника в текущий момент (до того, как будут сделаны какие-либо обновления).В настоящее время я использую метод getEmployee (), а затем регистрирую наблюдателя сотрудника:

public class MyClass implements EmployeeObserver{

 ...

 Employee employee= subjectClass.getEmployee();

 subjectClass.registerEmployeeObserver(this);

 ... 

}

Что-то не так с объединением этих методов, так что объект Employee возвращается в том же вызове метода, который наблюдательзарегистрирован в?:

Employee employee = subjectClass.getAndObserveEmployee(this);

Я знаю, что это может показаться немного странным, но мне нужен метод getEmployee только тогда, когда класс наблюдателя инициализирован, а у subjectClass уже есть довольно большой интерфейс, который я хочу сократить до минимума.Итак, это приемлемо или это плохая практика объединять два действия в один вызов метода?

Ответы [ 2 ]

0 голосов
/ 08 июня 2011

Если иногда вам не нужен работник, вы должны сделать

subjectClass.getAndObserveEmployee(this);

, что выглядит странно. или если иногда вам нужно нанять сотрудника, но не регистрироваться:

Employee employee = subjectClass.getAndObserveEmployee(null);  

что опять не приятно. Если, скажем, вы хотите изменить часть register (то есть еще один аргумент), вам нужно изменить места, где вы используете функцию, только для get(). Я бы не стал этого делать, кроме как в случае необходимости, как в случае

oldVal = ConcurrentMap.replaceValue();

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

0 голосов
/ 08 июня 2011

Чистее разделять их.

В отдельном примечании, почему у самого Employee нет метода addObserver()?Может быть вполне веская причина, но это будет мое первое предположение о том, где его найти, если я его искал.Либо это, либо какой-то сервис, который управляет сотрудниками и имеет addObserver(int employeeIdToObserver), или что-то в этом роде (подразумевается, что у вас уже есть ссылка на сотрудника до того, как вы его заметите.

Кроме того, один из способовМожно написать шаблон ...

public interface EmployeeObserver {

    public void stateChanged(State oldState, State newState);

} 

... для наблюдателей, которым необходимо знать, какое состояние было до изменения.

...