Мы постоянно спорили на моем рабочем месте по поводу использования шаблона Observer для одной из проблем. Я как-то чувствую запах "чрезмерного употребления", но открыт для идей. Итак, требование:
У нас есть иерархия объектов -> заказ и несколько позиций в заказе. Когда заказ отменяется, необходимо отменить все позиции.
Для этого мы создали класс OrderCancel, который является субъектом в идиоме паттерна Observer, и класс LineItemCancel, который является Observer. У нас также есть класс OrderManager с методом cancelOrders (Список заказов), который создает экземпляры 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() {
}
}
Я убежден, что это неправильное использование. Но я не могу убедить дизайнеров этого класса. Я пытаюсь понять, правильно ли это, поскольку дизайнер - один из архитекторов в работе.
Жду ваших мыслей.