2012-03-08 32 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