2013-06-05 3 views
5

У меня возникают проблемы с шаблоном наблюдателя. Он говорит, что Observer и Subject должны быть интерфейсами. Я понимаю, почему наблюдатели являются интерфейсами, но почему не лучше, чтобы тема была абстрактным классом? Не могли ли вы уже реализовать хотя бы удаление/регистрацию?Обзор абстрактного шаблона наблюдателя против интерфейса

ответ

8

Образцы дизайна предназначены для адаптации к конкретным потребностям приложений; они не предписывают правила, установленные в камне. В частности, для вас нужно решить, является ли что-то абстрактным классом или интерфейсом, учитывая все последствия, которые решение имеет для остальной части приложения.

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

+0

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

5

Почему не просто абстрактный класс, который реализует тему? Использование интерфейса просто дает вам большую гибкость. На самом деле вы не покупаете ничего, чтобы начать с абстрактного класса. Если вещи все меняются очень много (скажем, границы пересечения границ), то ваш Observable будет зависеть от абстрактной реализации.

+0

хорошо поблагодарить у всех ребят, которые помогли много :) – Maximosaic

1

почему не лучше иметь испытуемому абстрактный класс

Чтобы избежать привязки конструкции к конкретной конкретной реализации. Помните, что целью является создание шаблона, который даст вам гибкость при необходимости заменять конкретные предметы и не будет привязан наблюдателей к тому, что было в оригинальной реализации.

Вы не хотите, чтобы наблюдатели ссылаться на FirstConcreteSubject, а интерфейс ISubject, который может быть быстро изменен быть реализован SecondConcreteSubject без необходимости модифицировать наблюдатель.

Тем не менее, нет ничего плохого (IMHP) с наличием BaseSubject абстрактного класса для хранения некоторых из кода, который был бы в противном случае дублируется FirstConcreteSubject и SecondConcreteSubject.

2

В шаблоне проектирования, когда используется интерфейс слова, это означает абстрактный API, который подвергается клиентскому компоненту, который будет иметь различные конкретные реализации.

Когда интерфейс шаблона проектирования сопоставляется с Java-миром, он может быть либо интерфейсом Java, либо абстрактным классом Java, и отображать конкретные классы конкретных классов в обычный класс Java (не абстрактный).

Однако при принятии решения вам необходимо понять разницу между интерфейсом Java и абстрактным классом и их целью, а также плюсами и минусами.

См: Interface Vs Abstract Class

Смежные вопросы