TemplateMethod 패턴으로 작업자를 구현 하시겠습니까?
-
09-12-2019 - |
문제
나는 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);
.
각 계층 구조 수준에 대해 분명한 단점이있는 에는 추가적인 새로운 방법이 있습니다.
내 통제하에 있지 않은 새로운 사용자가 구현 된 근로자를 통해조차도 모든 사전 및 사후 프로세스 방법이 실행되도록 보장하고 싶습니다.
어떻게 그렇게합니까?
해결책
템플리트 메소드 패턴을 따르는 경우 doPreProcessing
및 doPostProcessing
메소드가 서브 클래스에서 재정의되도록 클래스를 설계 하여이 작업을 수행합니다.서브 클래스가 수퍼 클래스를 호출 할 수 없으므로 새 클래스가 호출 할 수 없기 때문에이 작업을 원하지 않으므로 새로운 사용자와도 모든 사전 및 사후 프로세스 메소드가 실행되었음을 보장 할 수 없습니다.-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
}
}
. 제휴하지 않습니다 StackOverflow