2016-12-22 30 views
2

夥計們我只想清楚我對抽象類方法的工作的懷疑。希望我會得到滿意的答覆。想要了解模板方法背後的邏輯

我們有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 
    } 
} 

現在,當我們調用等作爲

new Derived().operaton_second(); 

它總是調用派生operation_first類方法operation_second方法。 我只想知道這種方法背後的邏輯,其中Base類稱爲派生類方法。

+0

您呼叫的operaitions_second內operation_first()()方法,因此需要調用它的抽象 –

+0

方法加以overrided這就是隻有他們被稱爲抽象方法..所以whenver你調用一個抽象方法它總是會調用派生類的覆蓋方法...那是所有 –

+0

雅我知道我在operation_second()方法內調用operation_first()方法,但我想知道它爲什麼會發生。 –

回答

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; 
} 
+0

如何從superclass調用operation_first方法,我們用派生類實例調用operation_second方法,但是如何調用operation_first方法在這裏調用,它將如何知道派生類對象的引用。 –

+0

那麼你會在派生類上調用operation_second方法,以便operation_second將從同一個派生類中調用operation_first方法。 –

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/