ما هو الفرق بين استراتيجية الأنماط وطريقة الزوار وطريقة القالب؟

StackOverflow https://stackoverflow.com/questions/4266750

سؤال

أنا في فصل حيث تعلمنا للتو أنماط التصميم هذه. ومع ذلك لم أستطع رؤية أي فرق بينهما. تبدو مثلها تمامًا ، مما يخلق فصولًا ملموسة على الفئة التجريدية. هل يمكن لأحد أن يساعدني في قتل هذا الشك؟ شكرًا (:

هل كانت مفيدة؟

المحلول

يشمل كل من الزائر والاستراتيجية ونمط القالب تطبيق خوارزمية. الفرق الأكبر هو كيف يتم استحضارها وكيفية استخدامها في الممارسة العملية. على الرغم من أن الأمر قد يبدو أن لديهم نفس حالة الاستخدام ، إلا أن انظر إلى بناء الكائنات لمعرفة الفرق.

غالبًا ما يتم استخدام نمط الاستراتيجية عندما لا يكون لدينا القدرة على المرور حول الوظائف ككائن من الدرجة الأولى. إنه يتوقع قائمة وسيطة محددة للغاية وفقط قائمة الوسيطة هذه في نمط المكالمات. على سبيل المثال:

struct MyStrat{
    void operator()(const Foo &_input){
        _input.up( 2 );
    }
};

std::for_each( myFooList.begin(), myFooList.end(), MyStrat() );

التي يتم تطبيقها بعد ذلك على قائمة كائنات من النوع "فو". ليس لدينا أي طريقة أخرى لتطبيقه على أي كائن آخر.

يتم استخدام نمط الزائر من ناحية أخرى عندما نريد تطبيق خوارزمية على مجموعة من الكائنات التي قد لا تشارك نفس التوقيع ولا يوجد نفس وظائف العضو. نقول نمط الزوار لأنه يستخدم غالبًا عند عبور شجرة أو مجموعة أخرى من الأشياء "غير ذات الصلة" (لا علاقة لها بمعنى الميراث.)

struct MyVisitor{
    void visit(const Foo &_input){
         _input.up( 2 );
    }
    void visit(const Bar &_input){
         _input.raiseUp( 2 );
    }
    void visit(const Baz &_input){
         _input.setUp( 2 );
    }
 };

هنا ، الفكرة هي أننا نود "رفع" كل هذه الأشياء. لا يشاركهم جميعًا توقيع وظيفة العضو نفسه ولكن جميعهم مرتبطون من الناحية المفاهيمية. وبالتالي ، يمكننا "زيارة" كل فئة من هذه الفئات ولكن نتوقع أن تؤدي الخوارزمية نفس النوع من المهمة.

باستخدام نمط الزائر ، نتجنب الحاجة إلى لف كل فئة في نمط وكيل. وبالتالي ، بالنسبة لفصول N نود تطبيق هذه الخوارزمية على أننا لسنا بحاجة إلى إنشاء فصول الوكيل N. نحتاج فقط إلى إضافة طرق n إلى فئة الزوار.

تختلف طريقة القالب تمامًا عن الزائر ونمط الاستراتيجية. مع القالب الذي تحاول القيام به هو تطبيق نفس النوع من الخوارزمية ولكن على فئات فرعية مختلفة داخل التسلسل الهرمي. على سبيل المثال:

class Duck{
public:
    int count() =0;
    void makeNoise(int times) =0;
    void quack(){ makeNoise( count() ); }//the template pattern is here
};

class Mallard : public Duck{
public:
    int count(){ return 4; }
    void makeNoise( cout << "quack" << endl; }
};

class Daffy{
public:
    int count(){ return 1; }
    void makeNoise( cout << "Why I ought to..." << endl; }
};

وبالتالي فإن نتيجة الخوارزمية تختلف ضمن التسلسلات الوحيدة.

نصائح أخرى

القواسم المشتركة:

  1. الاستراتيجية وطريقة القالب والزائر : يتم تصنيف جميع الأنماط الثلاثة على أنها أنماط سلوكية.

اختلافات:

  1. طريقة القالب يستخدم الميراث و إستراتيجية يستخدم التكوين
  2. ال طريقة القالب لا ينبغي تجاوز تنفيذ الفئة الأساسية. وبهذه الطريقة ، يتم التحكم في هيكل الخوارزمية بواسطة الفئة الفائقة ، ويتم تنفيذ التفاصيل في الفئات الفرعية
  3. إستراتيجية يغلف الخوارزمية خلف واجهة ، والتي توفر لنا القدرة على تغيير الخوارزمية في وقت التشغيل
  4. زائر يستخدم النمط لإجراء عملية على مجموعة من الكائنات المماثلة. بمساعدة نمط الزوار ، يمكننا نقل المنطق التشغيلي من الكائنات إلى فئة أخرى
  5. إذا كان هناك تغيير في تنفيذ العملية ، فيجب علينا فقط التغيير زائر الفصل بدلا من لمس جميع الكائنات الأخرى.

القي نظرة على طريقة القالب , إستراتيجية و زائر و صناعة المصدر مقالات لفهم أفضل.

المنشورات ذات الصلة:

متى يجب أن أستخدم نمط تصميم الزوار؟

مثال في العالم الحقيقي لنمط الاستراتيجية

نمط تصميم القالب في JDK ، لم يتمكن من العثور على طريقة تحدد مجموعة من الأساليب التي سيتم تنفيذها بالترتيب

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top