문제

나는 worker 클래스의 계층 구조를 가지고 있으며, 이들 모두는 공작물로 일종의 처리를 수행합니다.그 아이디어는 각 작업자가 일부 사전 처리를 수행하고, 공작물을 하위 클래스로 밀어 넣은 다음 일부 후 처리를 수행합니다.

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);
. 각 계층 구조 수준에 대해 분명한 단점이있는

에는 추가적인 새로운 방법이 있습니다.

내 통제하에 있지 않은 새로운 사용자가 구현 된 근로자를 통해조차도 모든 사전 및 사후 프로세스 방법이 실행되도록 보장하고 싶습니다.

어떻게 그렇게합니까?

도움이 되었습니까?

해결책

템플리트 메소드 패턴을 따르는 경우 doPreProcessingdoPostProcessing 메소드가 서브 클래스에서 재정의되도록 클래스를 설계 하여이 작업을 수행합니다.서브 클래스가 수퍼 클래스를 호출 할 수 없으므로 새 클래스가 호출 할 수 없기 때문에이 작업을 원하지 않으므로 새로운 사용자와도 모든 사전 및 사후 프로세스 메소드가 실행되었음을 보장 할 수 없습니다.-implemented 근로자. "

상속을 사용하는 대신에, 작업자 객체가 함께 체인 된 디자인을 시도 할 수 있습니다.

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
    }
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top