想要了解模板方法背后的逻辑

时间:2016-12-22 07:17:18

标签: java android oop

伙计们我只是想清楚我对抽象类方法的工作有疑问。希望我会得到满意的答案。

我们有Class Base(抽象类)和Class Derived(具体类)定义如下:

abstract class Base {
   abstract public void operation_first();

   public void operation_second{
      operation_first();
   }
}

class Derived extends Base {
   public void operation_first{
     //Implementation
   }
}

现在我们将operation_second方法称为

new Derived().operaton_second();

它始终调用派生类operation_first方法。 我只想知道这种方法背后的逻辑,其中Base类称为派生类方法。

3 个答案:

答案 0 :(得分:0)

这称为“后期绑定”。唯一的类函数operation_first是在Derived中实现的,并且由于后期绑定,Base类知道这个实现。

请参阅https://en.wikipedia.org/wiki/Late_binding

答案 1 :(得分:0)

当有几个(相关的)类具有公共代码时,我使用此模式。您可以将公共部分放在基类中,并将特定代码放在派生类中,即operation_first方法。在基类中,您可以使用一个方法(这将是您的operation_second方法),您可以在其中放置对所有派生类都相同的操作流。这样,您可以删除重复的代码,并将操作流程放在中心位置。

public abstract class AbstractMessageHandler<T extends RequestMessage>() {
    public ResponseMessage process(T requestMessage) {
        // some common logic

        validate(requestMessage);

        // some more common logic

        Transaction transaction = getTransaction(requestMessage);

        // some more common logic

        ResponseMessage response = processTransaction(transaction, requestMessage);

        // some more common logic

        return response;
    }

    protected abstract boolean validate(T requestMessage);

    protected abstract Transaction getTransaction(T requestMessage)

    protected abstract ResponseMessage processTransaction(Transaction transaction, T requestMessage);

}

使用策略模式调用流程方法的代码示例。 EXECUTOR_MAP包含AbstractMessageHandler的所有具体实现。

public ResponseMessage execute(RequestMessage requestMessage)
        throws MessageHandlerNotFoundException {

    if (requestMessage == null) {            
        throw new MessageHandlerNotFoundException(
                "Request message is null so no message handler could be found.");
    }

    MessageHandler messageHandler = EXECUTOR_MAP.get(requestMessage.getMessageTypeIdentifier());
    if (messageHandler == null) {            
        throw new MessageHandlerNotFoundException("No message handler found for message: "
                + requestMessage.getClass().getName());
    }

    ResponseMessage ctepMessageResponse = messageHandler.process(requestMessage);
    return ctepMessageResponse;
}

答案 2 :(得分:0)

想象一下,您需要生成不同类型/结构的文档。

实际上,生成XML文件必须运行的算法与生成CSV文件,XLSX文件的算法完全不同......

在这种情况下,有两个级别的模板方法:

  • 第一级是定义生成算法的地方;
  • 第二级是指定要检索的数据的位置。

Automatic Report Generator's Class Diagram

您可以尝试使用此API(源代码可用)。

来源:

https://mvnrepository.com/artifact/net.sf.automatic-report-generator(此处提供源代码)。

https://sourceforge.net/projects/automatic-report-generator/