في نمط الاستراتيجية، يمكن أن تأخذ الاستراتيجية السياق كمعلمة

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

  •  19-09-2019
  •  | 
  •  

سؤال


ملاحظات ملخص

سأغلق الآن هذا Thead (أعتقد أنه لن يكون هناك ملاحظات أكثر) ومحاولة تلخيص ما فهمته

  1. إن استخدام "السياق" كمعلمة لاستراتيجيتي يقدم اقتران ضيق يجب تجنبه، كما يمكن أن يجبرني أيضا على فضح الخصائص التي يجب أن تظل مخفية في الفصل.
  2. لتقليل الاقتران، سيكون من الأفضل تقديم القيم المطلوبة أو على الأقل لاستخدام واجهة بدلا من نوع ملموسة إلى الاستراتيجية.

أحاول الحصول على نظرة عامة واضحة على نمط الاستراتيجية وأنا أسأل نفسي إذا كانت تصميما جيدا أو سيئا أن تعتمد الاستراتيجية على السياق.

دعونا نأخذ التنفيذ الكلاسيكي التالي

//The strategy
interface IStrategy  
{  
  void Execute();  
}  

class ConcreteStrategyA : IStrategy
{
  public void Execute()
  {
    Console.WriteLine( "Called ConcreteStrategyA.Execute()" );
  }
}

class ConcreteStrategyB : IStrategy
{
  public void Execute()
  {
    Console.WriteLine( "Called ConcreteStrategyB.Execute()" );
  }
}

//The context
class Context
{
  IStrategy strategy;

  // Constructor
  public Context(IStrategy strategy)
  {
    this.strategy = strategy;
  }

  public void UpdateContext(IStrategy strategy)
  {
    this.strategy = strategy;
  }

  public void Execute()
  {
    strategy.Execute();
  }
}

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

من شأنه أن يعطي شيئا مثل

//The strategy
interface IStrategy  
{  
  void Execute(Context arg);  
}  

والاحتجاج سوف يعطي

//The context
class Context
{
  ....

  public void Execute()
  {
    strategy.Execute(this);
  }
}

هل هذا "اقتران" يجب تجنبه؟ هل الامور على ما يرام؟

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

المحلول

قضية واحدة أرى بها مع نهجك هي أنه سيكون هناك اقتران ضيق بين الخرسانة سياق الكلام فئة وحالات فئات الاستراتيجية. هذا يعني أن فئات الإستراتيجية يمكن استخدامها فقط مع فئة السياق. إحدى طرق التحايل على ذلك هو أنه لجعل فئات الاستراتيجية تعتمد على (أو استخدام) واجهة أن فئة "السياق" ستنفذ.

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

بديل يمكنك التفكير في ليس اجتياز المرجع (هذا) من فئة السياق إلى الأسلوب (الأساليب) في فئة الاستراتيجية ولكن لتمرير البيانات المطلوبة فقط إلى فئة الاستراتيجية.

على سبيل المثال، إذا كان فئة السياق شيئا مثل هذا: (الرمز في جافا)

Context {
   IStrategy strategy;
   List<Integer> scores;

   public Context(IStrategy strategy)
   {
        this.strategy = strategy;
        scores = new ArrayList<Integer>
   }

   public print() {
       strategy.sort(scores);
   }
}

public interface IStrategy<Integer> {
    public void sort(List<Integer> l);
}

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

نصائح أخرى

IMHO، كل شيء على مايرام. لكنني أفضل اجتياز السياق للاستراتيجية من خلال منشئ فئة تنفيذ الإستراتيجية.

الكود الخاص بك هو التعليمات البرمجية الخاصة بك، وكتابة مهما كان المنطقي بالنسبة لك. ومع ذلك، لدي كلمة تحذير.

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

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

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

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