检查一组数据结构的信息

时间:2012-09-28 08:07:02

标签: java design-patterns data-structures

最近,在我正在进行的项目中,我遇到了以下问题:

假设我有一组(树状)数据结构:

SellingContract
    Buyer
        Address
            city
            phone
        Finance
    Seller
        Address
    Items
        Price
        Stuff
    OtherStuff

SellingContract会经过几个商业用语,每个人都必须检查SellingContract数据,以确定它是否满足某些条件。

首先,我让顶部容器(SellingContract)提供所有条件检查器方法:

SellingChecker.tooMuchItems()
SellingChecker.canProceedToStepXXX()

但每次出现新情况时我都要修改SellingContract

有人能建议我一个优雅的方法来解决这个问题吗?

目前,我正在考虑两种方法:

  1. SellingContract应用访客模式,SellingContract将提供方法acceptConditionChecker(ConditionChecker),条件检查器将实现接口ConditionChecker

  2. 创建以SellingContract为参数的实用程序类,然后检查条件。这种方法要求实用程序类知道SellingContract的结构,对我来说似乎是程序性的。

2 个答案:

答案 0 :(得分:0)

我会考虑chain-of-responsibility pattern,每个处理程序会检查一个条件,如果没有,它会传递下一个处理程序的信息。

答案 1 :(得分:0)

首先,我认为SellingContract提供所有条件检查方法是不好的。该课程只应关注持有数据并提供对数据的访问。

至于你的两种方法:

  1. 我不认为访客模式在这里很有用。为了正确应用,访问者应该能够访问不同类型的对象;在您的情况下,这将是SellingContractContract的不同类型。同样非常有用,应该需要不同类型的访客。但除了ConditionChecker之外还会是什么。总而言之:我不认为访客模式在这里很有用。
  2. 这种方法似乎很明智。我不认为实用程序类知道SellingContract结构是一个问题;他们实际上只需要知道它的公共接口。但是他们无法在不知道任何相关信息的情况下合理地检查该对象的状况,所以我在这里看不到问题。此外,您的要求无论如何都意味着一步一步的程序,因此如果您的方法是一个简单的程序,它不是一个大问题。 我推荐这种做法。
  3. 根据您的条件,您可以为每个条件编写一个ConditionChecker,然后编写一个类,逐步应用这些条件。这也将使代码更容易调试和读取,因为您可以轻松地执行诸如在您喜欢的IDE中逐步执行代码并查看中间结果的事情。

    在我正在进行的项目中,我们遇到了类似的问题:对学生数据进行操作,检查他们是否符合学位的所有条件,并提供有关哪些条件得到满足而且未满足用户的信息。我们使用第二种方法,效果很好。我们的软件架构师也同意这是一个很好的解决方案。

    您可以选择实现特定于域的语言来指定条件和规则。这将允许您让业务自己编写条件。但这需要花费更多的努力才能实现。