确保只处理相应的实现或子代

时间:2009-12-08 15:45:38

标签: design-patterns oop interface

想象一下以下情况:

example http://img4.imageshack.us/img4/9849/oop2.png

可能会注意到Handler - 孩子和Costumer - 孩子相互匹配。每个Handler都有一个需要客户的方法。

有没有什么好方法可以确保Handler - 实现只需要相应的Costumer - 实现或其中的任何子项?

一些例子:

  • Handler将占用所有Costumers
  • HandlerACostumerACustomerAA但不会CostumerBCostumer
  • HandlerAA只会CostumerAA

我提出了一些想法:

  • 进行Handler实施检查,看它是否知道<{1}}
  • 创建一个执行检查的调度程序

这些都不好看,因为总是需要对结构进行硬编码。如果添加另一个子类,则需要更改检查哪个非常糟糕的逻辑。

2 个答案:

答案 0 :(得分:2)

我并不为这个设计而疯狂,但我可以想到它可能适合的情况。

Spring Validator接口采用了类似的方法。类似于他们的解决方案是使Handler接口包含方法boolean handles(Class c)。然后,每个Handler实现都有一个简单的方法,如

public class HandlerA extends Handler {
  boolean handles(Class c) {
    return (CustomerA.class.isAssignableFrom(c));
  }

  //etc.
}

当然,实施会因您的语言/平台而异。

这样,调用Handler的调用者负责通过调用此方法首先检查它是否是正确的处理程序。

答案 1 :(得分:1)

根据您的确切要求,似乎每个类或子类必须知道的唯一事物是另一个层次结构中的相应类或子类。我认为没有要求知道它的子类。

几个简单的实现可能符合您的需求:

  • 每个类检查其方法实现,如果其他类对应,或者是子类(我确定你的OO语言可以测试它)。
  • 每个类的寄存器在其构造函数中调用相应的类到超类;在每个方法中,该超类检查相应的类是否等于该类的(或子类)。
  • 泛型类型(或模板)还可以确保在编译时调用者将相应的子类作为参数传递

请告诉我是否/我错了: - )


正如马克所说,也许你有一种设计气味...... :-) 拥有两个相互映射的层次结构可能不是最好的事情...... 如果你想......我们可以帮你解决这个问题: - )