可以使用界面的默认方法来描述行为吗?

时间:2019-07-15 11:58:54

标签: java interface

可以使用界面的默认方法来描述行为/场景吗?我的意思是描述方法调用的顺序。 简单示例:

public interface ExportService {
    Order getOrder(long id);
    void validateOrder(Order order);
    void processOrder(Order order);
    void processException(e);

    //is this bad? 
    default void executeOrder(long id) {
        try {
            Order order = getOrder(id);
            validateOrder(order);
            processOrder(order);
        } catch (Exception e) {
            processException(e);
        }
    }
}

任何链接或最佳做法都将非常棒! 谢谢

在这种情况下,是否更正确:

public interface ExportService {
    Order getOrder(long id);
    void validateOrder(Order order);
    void processOrder(Order order);
    void processException(e);
}

public abstract class AbstractExportService implements ExportService {
    public abstract Order getOrder(long id);
    public abstract void validateOrder(Order order);
    public abstract void processOrder(Order order);
    public abstract void processException(e);

    protected void executeOrder(long id) {
        try {
            Order order = getOrder(id);
            validateOrder(order);
            processOrder(order);
        } catch (Exception e) {
            processException(e);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

应在接口的Javadoc和方法的Javadoc中描述方法调用的正确顺序。那是您界面的用户应该去学习界面契约的地方。

定义default方法只是其他方法用法的一个例子,这毫无意义。如果从不希望实现接口的类实现该方法,则没有必要在接口中添加方法。

此外,该default方法不能强制您界面的用户按所需顺序使用其他方法。在Javadoc中描述接口的正确用法也不会强制接口的用户正确使用接口,但是如果他们不遵守合同,并且接口不能按预期工作,也不要感到惊讶

答案 1 :(得分:0)

您似乎想要实现的是应用 Template Method设计模式GoF book中描述的行为模式)。

该模式的目的是为步骤指定一个带有占位符的框架算法。这样的结果是,您可以通过模板方法来帮助确保客户端代码(间接)以正确的顺序调用方法。

在您的情况下,executeOrder是模板方法,抽象方法是占位符,由子类实现。

您的第二个代码片段非常类似于Template Method模式的典型应用程序。有点不对劲的地方是公开了step方法,以便客户可以违反您的订购约束。为了确保遵守订购约束,通常的解决方案是让您:

  • executeOrder声明为publicfinal,因此它是代码的唯一入口点;
  • 如果可能,声明算法protected中步骤的方法,以使包外部的客户端无法直接调用它们。