سؤال

لدي التسلسل الهرمي ل 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 يتم تجاوز الأساليب في الفئات الفرعية.أعتقد أنك لا تريد القيام بذلك، لأنك لا تستطيع التأكد من أن الفئات الفرعية سوف تستدعي السوبر، وبالتالي لا يمكنك "ضمان تنفيذ جميع أساليب ما قبل وبعد العملية حتى مع المستخدم الجديد - العمال المنفذين."

بدلاً من استخدام الوراثة، يمكنك تجربة تصميم يربط الكائنات العاملة معًا، مثل هذا:

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