2009-11-16 52 views
1

我這是由幾種不同類型的銷售訂單繼承了SalesOrder類。它有一個名爲ValidateItems(OrderItemList,itemAdditionalValidation)的方法,該方法接受訂單商品列表和委託商對訂單商品進行附加驗證。不同的銷售訂單分別定義它們自己的委託版本,然後在調用父級SalesOrder類的ValidateItems時傳遞它們。委託接受一個OrderItem對象。 OrderItem類有一個Validate()方法。 ValidateItems方法遍歷列表並在每個OrderItem上調用Validate,然後調用itemAdditionalValidation委託並在OrderItem中傳遞它。重構一些我的代碼

到目前爲止,當我想驗證的項目,我總是會創建的所有項目添加到相應的訂單,然後順序將調用ValidateItems,並採取所有驗證的照顧。但是,現在我希望能夠直接調用OrderItem.Validate而不創建訂單,但是我不知道如何重構委託。基本上我希望OrderItem能夠根據它處理的訂單類型知道要調用哪個代理。有任何想法嗎?還有關於如何改進我目前的架構的任何提示將不勝感激。

回答

0

具體SalesOrder每個子類提供一種OrderItem的驗證器,用來通過ValidateItems()methoid?如果這是SalesOrder的一種方法,那麼您不需要將additionalValidator作爲參數傳遞,那麼您已經擁有了它。

它似乎很合理的SalesOrder也提供isThisOrderItemValid(項目)方法。它將驗證器應用於提供的項目。或者可能是一個addOrderItem(item)方法,如果它有效,它將添加它,否則會引發異常。

一旦我們把驗證通過SalesOrder所擁有那麼我看不出問題。代表或其他技術的使用是SalesOrder的一個實現細節。

+0

是的,但我需要能夠驗證一個訂單項自己沒有把它訂單。原因是我有一個表格,當客戶轉移到下一個訂單項目時,應該驗證每一行訂單項目,但我不希望它每次都按順序驗證所有訂單項目。我只想在發生時確認一個訂單商品。 – Riz 2009-11-16 23:33:20

+0

實際上你的第二段很有意義。我會去做! – Riz 2009-11-16 23:48:19

0

我不能完全肯定,如果我正確地理解你的問題,但只是作爲一種猜測也許你可以做這樣的事情:

  • 使用標記接口來聲明你正在處理的是什麼類型的OrderItem的。因此,例如,你可以有一兩種不同類型的OrderItems的:

    GoodOrderItemImpl implements GoodOrderItem { } 
    BadOrderItemImpl implements BadOrderItem { } 
    
  • GoodOrderItem和BadOrderItem接口可能會延長,實際上有方法驗證接口OrderItem的();在它

  • 定義,那麼您可以創建一些無所不知類,它知道對應於問題,例如標記接口是什麼類型的附加驗證器

    public final class ValidatorGuru { 
        // A map that maps GoodOrderItem.class with GoodOrderValidator and BadOrderItem.class with BadOrderValidator 
    } 
    
  • 然後,當你想驗證GoodOrderItemImpl例如,你可以使用標記接口,找出它使用的GoodOrderValidator作爲其額外的驗證(即從ValidatorGuru),然後調用goodOrder.validate() ;然後goodOrderValidator.validate(goodOrder);