2011-06-10 205 views
5

我們一直在我的工作地點來回討論使用Observer模式來解決其中一個問題。我以某種方式聞到「過度使用」,但對想法持開放態度。所以要求是觀察者模式 - 什麼時候到

我們有一個對象的層次結構 - >順序和訂單中的多個行項目。訂單取消時,所有訂單項都需要取消。

爲此,我們創建了一個OrderCancel類,它是觀察者模式習語中的主語,是觀察者的LineItemCancel類。我們還有一個帶有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() { 
    } 
} 

我相信這是使用不當造成的。但我無法說服這個班的設計師。如果這是正確的,我正試圖弄清楚自己,因爲設計師是工作中的建築師之一。

期待聽到你的想法。

+0

一個項目只能與一個訂單相關? – 2011-06-10 14:12:38

回答

2

觀察者模式僅在減少耦合時纔有用。在這個例子中,我看不到任何耦合的減少,所以我會說它是過度使用。

2

我同意w/@Pace,絕對不會減少耦合,絕對過度使用。我的問題是,在你的例子中,最簡單的方法是取消訂單時取消它自己的LineItems;有沒有理由不這樣做你的應用程序?