首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用模板方法模式实现工作链?

使用模板方法模式实现工作链?
EN

Stack Overflow用户
提问于 2012-03-08 19:28:35
回答 1查看 762关注 0票数 0

我有一个worker类的层次结构,所有这些类都对工件进行某种处理。这个想法是,每个工人做一些预处理,将工件推送到子类,然后进行一些后处理:

代码语言:javascript
复制
public void process(Workpiece wp) {
   doPreprocessing(wp);
   sub.process(wp); // this obviously doesn't work
   doPostProcessing(wp);
}

现在我正在通过声明新的抽象方法来解决这个问题:

代码语言:javascript
复制
public final void process(Workpiece wp) {
   doPreprocessing(wp);
   subProcess(wp); // this obviously doesn't work
   doPostProcessing(wp);
}

protected abstract void subProcess(Workpiece wp);

这具有明显的缺点,即对于每个层次级别,都有一个额外的、新的方法。

我想要保证,所有的预处理和后处理方法都可以执行,即使是新的、用户实现的工作程序,也不在我的控制之下。

你会怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-08 20:09:49

遵循模板方法模式,您可以通过设计类来实现这一点,以便在子类中覆盖doPreProcessingdoPostProcessing方法。我猜您不想这样做,因为您不能确定子类是否会调用super,因此您不能“保证即使使用新的、用户实现的工作进程,也能执行所有的预处理和后处理方法”。

您可以尝试将worker对象链接在一起的设计,而不是使用继承,如下所示:

代码语言:javascript
复制
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);
}

您的类和用户实现的类,不是扩展"next“worker,而是在它们的构造函数中创建"next”worker:

代码语言:javascript
复制
public class MyWorker extends Worker {

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

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

    public abstract void postProcess(Workpiece wp) {
        // code
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9616942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档