【问题标题】:Observer pattern - when to观察者模式 - 何时
【发布时间】:2011-06-10 14:02:46
【问题描述】:

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

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

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

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

期待听到您的想法。

【问题讨论】:

  • 一件商品只能关联一个订单?

标签: design-patterns observer-pattern overuse


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多