5

私たちは、問題の1つにオブザーバーパターンを使用することについて、私の職場で前後に議論してきました。私はどういうわけか「使いすぎ」のにおいがしますが、アイデアにはオープンです。したがって、要件は

オブジェクトの階層->注文と注文内の複数のラインアイテムがあります。注文をキャンセルする場合は、すべての広告申込情報をキャンセルする必要があります。

これを行うために、オブザーバーパターンイディオムのサブジェクトであるOrderCancelクラスと、オブザーバーであるLineItemCancelクラスを作成しました。また、CancelOrders(Listorders)メソッドを持つ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に独自のLineItemをキャンセルさせるという最も簡単なアプローチです。あなたのアプリのためにそれをしない正当な理由はありますか?

于 2011-06-10T14:17:20.197 に答える