5

我们一直在我的工作场所就使用观察者模式来解决其中一个问题争论不休。我以某种方式闻到“过度使用”的味道,但对想法持开放态度。所以要求是

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

为此,我们创建了一个 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() {
    }
}

我确信这是不恰当的使用。但我无法说服这门课的设计师。我试图弄清楚这是否正确,因为设计师是工作中的建筑师之一。

期待听到你的想法。

4

2 回答 2

2

观察者模式只有在减少耦合时才有用。在这个例子中我没有看到任何耦合减少,所以我会说它是过度使用。

于 2011-06-10T14:14:34.837 回答
2

我同意@Pace,绝对不会减少耦合,绝对不会过度使用。我的问题是,在您的示例中,最简单的方法是让 Order 在您取消它时取消它自己的 LineItems;是否有充分的理由不为您的应用程序这样做?

于 2011-06-10T14:17:20.197 回答