2012-03-08 20 views
0

我有一個worker類的層次結構,所有這些類都對工件進行某種處理。我們的想法是,每個工人做一些預處理,推動工件的子類,然後做一些後處理:使用templatemethod模式實現工作鏈?

public void process(Workpiece wp) { 
    doPreprocessing(wp); 
    sub.process(wp); // this obviously doesn't work 
    doPostProcessing(wp); 
} 

現在,我通過宣佈新的抽象方法解決這個:

public final void process(Workpiece wp) { 
    doPreprocessing(wp); 
    subProcess(wp); // this obviously doesn't work 
    doPostProcessing(wp); 
} 

protected abstract void subProcess(Workpiece wp); 

,它具有明顯的缺點,即對於每個層次級別,都有一個額外的新方法。

我想保證所有的前處理和後處理方法都是在新的,用戶實現的工人的情況下執行的,這些工人不在我的控制之下。

你會怎麼做?

+0

我不認爲我遵循:你目前的解決方案有什麼問題? – amit 2012-03-08 11:31:44

+0

工人鏈相當長,四名框架工人和他們下面的任意數量的用戶定義的工人。所以我有進程,子進程,subsubprocess,subsubsubprocess ...我不認爲這是一個簡單或優雅的解決方案。 – Jonathan 2012-03-08 12:02:57

回答

2

遵循模板方法模式,您可以通過設計類來完成此操作,以便在子類中覆蓋doPreProcessingdoPostProcessing方法。我猜你不想這樣做,因爲你不能確定子類會調用超類,因此你不能「保證所有的前處理和後處理方法即使對於新的用戶也能執行實施的工人「。

而不是使用繼承,你可以試試鏈工人對象在一起的設計,這樣的:

public abstract class Worker { 
    private Worker next; 

    protected Worker(Worker next) { 
     this.next = next; 
    } 

    public void process(Workpiece wp) { 
     preProcess(wp); 

     if (next != null) 
      next.process(wp); 

     postProcess(wp); 
    } 

    public abstract void preProcess(Workpiece wp); 
    public abstract void postProcess(Workpiece wp); 
} 

你的班,和用戶實現類,而不是擴大「下一步」工人,創建「下一個」工人在他們的建設者:

public class MyWorker extends Worker { 

    public MyWorker() { 
     super(new MyOtherWorker()); 
    } 

    public abstract void preProcess(Workpiece wp) { 
     // code 
    } 

    public abstract void postProcess(Workpiece wp) { 
     // code 
    } 
} 
+0

我會做出最後的決定,但除此之外,你是我的英雄! – Jonathan 2012-03-08 12:23:18