2014-10-02 5 views
1

Я изучаю объектно-ориентированные шаблоны проектирования, но не понимаю, почему это не шаблон наблюдателя, если у меня есть только конкретный слушатель и субъекты. В моем примере практики я создал сценарий офиса DMV с одним предметом, который называется DmvCounter и клиентами (наблюдатели). В моем основном методе клиенты построены с задачей, которую они хотели бы, чтобы отдел DMV завершил их.Является ли он все еще шаблоном наблюдателя без интерфейсов для наблюдателя и субъекта? Вот пример, который я не уверен в

Customer bob = new Customer("Bob", "Register Vehicle", 201); // number is bob's order 
Customer pat = new Customer("Pat", "Renew License", 202); 
dmvObject.register(bob); 
dmvObject.register(pat); 

dmvObject.handleRequest(200); // nothing happens - no customer for this request number 
dmvObject.handleRequest(202); // prints: "Pat says: Thank you - Renewed License" 

Мой вопрос заключается в межпроцессном обмене между двумя объектами. Нет интерфейса для наблюдателя, и нет интерфейса для объекта. Тема уведомляет список конкретных клиентов о конкретном номере заказа, который был завершен. И клиент оставляет офис DMV удовлетворенным. Разве это не шаблон наблюдателя?

enter image description here

+0

Я много работал над этой проблемой и вопросом, я хочу знать, ПОЧЕМУ это обозначено для закрытия? Почему люди говорят мне, что это не шаблон наблюдателя? Вот почему я задал этот вопрос .. –

+0

Что заставляет вас думать, что это не пример шаблона Observer? – deyur

+0

Мне сказали, что шаблон наблюдателя должен быть абстрактным. Там должен быть интерфейс наблюдателя, а не конкретный объект и конкретный наблюдатель, как я показал здесь. –

ответ

0

Это пример шаблона наблюдателя.

В типичной реализации Observer объект поддерживает список иждивенцев и уведомляет об этом иждивенцев, вызывая метод для каждого из них. Это ситуация, о которой вы описали.

Теперь вы можете сделать аргумент, что это не особенно полезная реализация шаблона Observer, поскольку объект Observable должен не только знать, какой тип объекта его наблюдает, но должен знать сигнатуру метода объект наблюдения. Это не является особенно расширяемым, потому что DmvCounter не может быть замечен ничем, кроме Customer.

Преимущество реализации интерфейса (как java.util.Observer) является то, что вы можете добавить любое разнообразие наблюдателей без необходимости менять DmvCounter, и все они могут быть уведомлены с помощью одного метода update(Observable o, Object arg).

+0

да, но они относятся к интерфейсу. Существует интерфейс наблюдателя. Мне сказали без интерфейса, что это не шаблон наблюдателя. –

+0

Это стандартная деталь реализации, но не обязательная часть шаблона. Часто имеет смысл, чтобы конкретный класс реализовал интерфейс, чтобы вы могли отделить реализацию наблюдателя от метода уведомления и иметь стандартный метод «уведомлять». Вы можете сделать аргумент, что ваш пример не является особенно расширяемой/многоразовой реализацией, но он по-прежнему отвечает общим требованиям для шаблона Observer. – deyur

0

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

Для чего нужен интерфейс? Ответ за полиморфизм.

Представьте, что у вас есть другой клиент, скажем, клиент2. Затем в DmvCounter, вы должны выполнять все функции для customer2 так:

public class DmvCounter() { 
    List<Customer> customer = new ArrayList<Customer>(); 
    List<Customer2> customer2 = new ArrayList<Customer2>(); 

    public void register(Customer customer) { 
     //do something 
    } 

    public void register(Customer2 customer2) { 
     //do something 
    } 

Теперь представьте, у вас есть 100 тип клиентов, и с каждым типом вы точно такую ​​же работу для регистра. Если вам нужно ввести код регистра 100 раз, это будет чрезвычайно трудоемкой и болезненной задачей. Таким образом, идея полиморфизма: какой бы тип потребителя он ни был, он по-прежнему является потребителем, и для этого вам просто нужна 1 функция регистрации.

Так что, чтобы ответить на ваш вопрос, да, это все еще своего рода картина наблюдения. Но это не шаблон наблюдения, потому что он не соответствует требованиям ООП, который является полиморфизмом.