Шаблон наблюдателя - когда - PullRequest
5 голосов
/ 10 июня 2011

Мы спорили на моем рабочем месте о том, как использовать шаблон Observer для решения одной из проблем. Я как-то пахну "чрезмерным", но я открыт для идей. Таким образом, требование

У нас есть иерархия объектов -> заказ и несколько позиций в заказе. Когда заказ отменен, все позиции должны быть отменены.

Для этого мы создали класс OrderCancel, который является Subject в идиоме шаблона Observer, и класс LineItemCancel, который является Observer. У нас также есть класс OrderManager с методом cancelOrders (List orders), который создает экземпляр OrderCancel и соответствующих объектов LineItemCancel, а затем регистрирует их все в OrderCancel. Код выглядит следующим образом.

public class OrderManager {
    public void cancelOrders(List<Order> orders){
        for(Order order :orders){
            OrderCancel orderCancel = new OrderCancel(order);
            Listener listener = new LineItemCancel(order);
            orderCancel.addListeners(listener);
            orderCancel.cancel();
        }
    }
}

public class OrderCancel implements Subject {
    private List<Listener> listeners = new ArrayList<Listener>();
    private Order order;

    public OrderCancel(Order order) {
        this.order = order;
    }

    @Override
    public void addListeners(Listener listener) {
        listeners.add(listener);
    }

    @Override
    public void notifyListeners() {
        for(Listener listener : listeners){
            listener.update();
        }
    }

    public void cancel() {
        notifyListeners();
        cancelOrder();
    }

    private void cancelOrder() {
    }
}

public class LineItemCancel implements Listener {

    private Order order;

    public LineItemCancel(Order order) {
        this.order = order;
    }

    @Override
    public void update() {
        cancelLineItem();
    }

    private void cancelLineItem() {
    }
}

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

Жду ваших мыслей.

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Я согласен с @Pace, определенно не уменьшает связывание, определенно злоупотребляет. Мой вопрос заключается в том, что в вашем примере самый простой подход состоит в том, чтобы ордер отменял свои собственные LineItems при его отмене; есть ли веская причина не делать этого для вашего приложения?

2 голосов
/ 10 июня 2011

Шаблон Observer полезен только тогда, когда он уменьшает связь.В этом примере я не вижу уменьшения связи, поэтому я бы сказал, что это чрезмерное использование.

...