类层次结构设计

时间:2012-02-01 14:51:39

标签: java design-patterns

我想为我的Java Project定义一个类层次结构。我的目的基本上是从电子邮件帐户收到电子邮件,并使用IMAPPOP3将其存储到数据库,具体取决于网站(例如gmx支持IMAP和yahoo支持{{1} })。我正在使用javamail API。假设我有2个名为POP3IMAP的子类。他们的相应方法如下:

POP3

  1. Execute_Parser
  2. Fetchemails
  3. CreateMSGDigest
  4. Get_Foldername
  5. Scan_Table
  6. Store_Emailinfo
  7. IMAP

    1. FetchEmails
    2. CreateMSGDigest
    3. Scan_Table
    4. Store_Emailinfo
    5. 正如您所看到的,POP3需要实现POP3不需要的2个额外方法。对于这两个类,通用方法的实现都是相同的。任何人都可以在这里建议我应该在基类中放入哪些方法?我想IMAP的所有方法对于这两个类都是常见的。但那么IMAP(Execute_Parser和Get_Foldername)的其他两种方法呢?

2 个答案:

答案 0 :(得分:0)

您可能希望在基类中添加所有6个方法,并提供默认的空实现。在Pop3实现中,您将覆盖所有6种方法,而在Imap类中,只覆盖您需要的4种方法。

现在,根据您的需要,您可能需要添加其他方法来查询对象,是否需要调用Get_FoldernameExecute_Parser方法(例如boolean isUseParserRequired ())。如果我们假设您创建了一个EmailProtocol抽象基类,并希望以通用方式使用它,则可能需要添加这样的辅助方法。它允许您在操作EmailProtocol实例时使用通用接口,而不必依赖if/else来确定您拥有的实例类型,然后调用适当的方法。

正如JB Nizet所提到的,你应该坚持使用Java命名约定。

答案 1 :(得分:0)

tl; dr子类化没有意义,因为POP3和IMAP之间没有IS-A关系

使用子类时,涉及的语义/动机完全不同。一个是您尝试在上下文中的两个实体之间建立一些自然的IS-A关系。您的上下文中的问题是IMAP和POP3协议之间是否存在IS-A关系。这里的答案是否定的! IMAP协议不是来自POP3,它不兼容等。 类层次结构的另一个语义集中在概念接口上,这意味着您可以对类层次结构进行建模,以便以统一和多态的方式实际使用类的实例。这种方法的另一种方法是不使用子类,这会导致类的紧密耦合,但是使用接口并通过组合模式共享公共代码。

我会使用接口并通过合成共享公共代码,因为使用这种方法可以避免紧密绑定没有IS-A关系的类。