观察者模式 - 何时到

时间:2011-06-10 14:02:46

标签: design-patterns observer-pattern overuse

我们一直在我的工作场所来回讨论使用观察者模式解决其中一个问题。我不知何故闻到“过度使用”,但我很开心。所以要求是

我们有一个对象层次结构 - >订单中的订单和多个订单项。订单取消后,所有订单项都需要取消。

为此,我们创建了一个OrderCancel类,它是Observer模式习语中的Subject和LineItemCancel类,它是Observer。我们还有一个带有cancelOrders(List orders)方法的OrderManager类,该方法实例化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 个答案:

答案 0 :(得分:2)

Observer模式仅在减少耦合时才有用。我没有看到这个例子中的耦合减少,所以我会说它过度使用。

答案 1 :(得分:2)

我同意@Pace,绝对不会减少耦合,绝对过度使用。我的问题是,在你的例子中,最简单的方法是让你取消订单时取消自己的LineItems;是不是有充分的理由不为你的应用做到这一点?