سؤال

حاولت قراءة العديد من المقالات عنه com.dofactory, ويكيبيديا والعديد من المواقع.ليس لدي أي فكرة عن الاختلافات بين نمط الجسر ونمط الاستراتيجية.

أعلم أن كلاهما يفصل التجريد عن تنفيذه ويمكنه تغيير التنفيذ في وقت التشغيل.

لكن ما زلت لا أعرف في أي موقف يجب أن أستخدم الإستراتيجية أو في أي موقف يجب أن أستخدم الجسر.

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

المحلول

دلالات.من ويكيبيديا:

مخطط فئة UML لنمط الاستراتيجية هو نفس الرسم البياني لنمط الجسر.ومع ذلك ، فإن هذين أنماط التصميم ليسا هو نفسه في نيتهم.في حين أن نمط الاستراتيجية مخصص للسلوك ، فإن نمط الجسر مخصص للبنية.

الاقتران بين السياق والاستراتيجيات أكثر تشددًا من الاقتران بين التجريد والتنفيذ في نمط الجسر.

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

نصائح أخرى

نمط الجسر هو نمط هيكلي (كيف يمكنك بناء مكون برمجي؟).نمط الإستراتيجية هو نمط ديناميكي (كيف تريد تشغيل السلوك في البرنامج؟).

الجملة متشابهة لكن الأهداف مختلفة:

  • إستراتيجية:لديك المزيد من الطرق لإجراء العملية.باستخدام الإستراتيجية، يمكنك اختيار الخوارزمية في وقت التشغيل ويمكنك تعديل استراتيجية واحدة دون الكثير من الآثار الجانبية في وقت الترجمة؛
  • كوبري:يمكنك تقسيم التسلسل الهرمي للواجهة والفئة، وربطهما بمرجع مجرد (انظر شرح)

إستراتيجية:

  • السياق المرتبط بالاستراتيجية:فئة السياق (ربما مجردة ولكنها ليست واجهة حقًا!كما ترغب في تغليف سلوك معين وليس التنفيذ بالكامل) ستعرف/تحتوي على مرجع واجهة الإستراتيجية و تطبيق لاستدعاء سلوك الاستراتيجية عليه.
  • النية هي القدرة على تبديل السلوك في وقت التشغيل

    class Context {
    
         IStrategy strategyReference;
    
         void strategicBehaviour() {
    
            strategyReference.behave();
         }
    
    }
    

كوبري

  • التجريد غير المرتبط بالتنفيذ:واجهة التجريد (أو الفئة المجردة التي تحتوي على معظم ملخصات السلوك) لن تعرف/تحتوي على مرجع واجهة التنفيذ
  • القصد هو فصل التجريد عن التنفيذ تمامًا

    interface IAbstraction {
    
        void behaviour1();
    
        .....
    
    }
    
    interface IImplementation {
    
         void behave1();
    
         void behave2();
    
         .....
    
    }
    
    class ConcreteAbstraction1 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationA() // Some implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave1();
    
          }
    
          .............
    
    }
    
    class ConcreteAbstraction2 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationB() // Some Other implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave2();
    
          }
    
          .............
    
    }
    

كوبري: (النمط الهيكلي)

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

استخدم هذا النمط عندما:

  1. لم يتم تحديد التجريدات والتطبيقات في وقت التجميع
  2. يجب تغيير التجريدات والتطبيقات بشكل مستقل
  3. يجب ألا تؤثر التغييرات في تنفيذ التجريد على تطبيق المتصل
  4. يجب أن يكون العميل معزولاً عن تفاصيل التنفيذ.

إستراتيجية: (النمط السلوكي)

تمكنك أنماط الإستراتيجية من التبديل بين خوارزميات متعددة من مجموعة من الخوارزميات في وقت التشغيل.

استخدم نمط الإستراتيجية عندما:

  1. مطلوب إصدارات متعددة من الخوارزميات
  2. يجب تغيير سلوك الفصل ديناميكيًا في وقت التشغيل
  3. تجنب العبارات الشرطية

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

متى تستخدم نمط الجسر؟كيف يختلف عن نمط المحول؟

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

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

أنواع أنماط التصميم

  • السلوكية: تميز الأنماط الطرق التي تتفاعل بها الفئات أو الأشياء وتوزع المسؤولية
  • الهيكلي: تتعامل الأنماط مع تكوين الفئات أو الكائنات.
  • إبداعية : الأنماط تشعر بالقلق إزاء عملية إنشاء الكائن.

كوبري (الهيكلي)

افصل التجريد عن تنفيذه بحيث يختلف كل منهما.بشكل مستقل. enter image description here

خذ جهاز التحكم عن بعد.جهاز التحكم عن بعد لديه الأزرار 1-6.هذه هي الفئة الملموسة في الرسم البياني أعلاه.سيعمل كل زر بشكل مختلف اعتمادًا على ما إذا كان جهاز التحكم عن بعد يستخدم للتلفزيون أو قرص DVD.يتم استخلاص وظيفة كل زر من التنفيذ بواسطة واجهة المنفذ.

يتيح لنا ذلك تغيير كيفية عمل جهاز التحكم عن بعد لكل جهاز.

إستراتيجية (سلوكية)

تحديد عائلة من الخوارزميات، وتغليف كل واحدة منها وجعلها قابلة للتبديل. enter image description here

من الناحية الاستراتيجية، إذا كنا ننظر إلى السيناريو البعيد."الحالة" هي جهاز التحكم عن بعد بالكامل والذي نقوم بتبديله عن طريق تغيير مرجع حالة السياق."concreteStateA" (جهاز التحكم عن بعد الخاص بالتلفزيون) "concreteStateB" (جهاز التحكم عن بعد DVD).

قراءة إضافية:

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

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

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

نمط الاستراتيجية في UML

نمط بريجد في UML

نمط الإستراتيجية في سويفت:

protocol PrintStrategy {
   func print(_ string: String) -> String
}

class Printer {
   let strategy: PrintStrategy

   init(strategy: PrintStrategy) {
      self.strategy = strategy
    }

  func print(_ string: String) -> String {
     return self.strategy.print(string)
  }
}

class UpperCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.uppercased()
    }
}

class LowerCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.lowercased()
    }
}

var lower = Printer(strategy: LowerCaseStrategy())
lower.print("I love Software Patterns")

var upper = Printer(strategy: UpperCaseStrategy())
upper.print("I love Software Patterns")

نمط بريجد في سويفت:

protocol Appliance {
   func run()
}

protocol Switch {
   let appliance: Appliance {get set}
   func turnOn()
}

class RemoteControl: Switch {
   var appliance: Appliance

   init(appliance: Appliance) {
       self.appliance = appliance
   }

   internal func turnOn() {
      appliance.run()
   }
}

class TV: Appliance {
   internal func run() {
      print("TV is ON")
   }
}

class Stereo: Appliance {
   internal func run() {
      print("Stereo is ON")
   }
}

var tvRemote = RemoteControl.init(appliance: TV())
tvRemote.turnOn()

var stereoRemote = RemoteControl.init(appliance: Stereo())
stereoRemote.turnOn()

ومن ويكي على نمط استراتيجية

<اقتباس فقرة>   

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

     

واقتران بين السياق و   الاستراتيجيات هو أشد من   اقتران بين التجريد و   تنفيذ في جسر   النمط.

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

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

لنمط استراتيجية فقط تنفيذ يختلف.

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

والآن إذا كان هناك حد ذاته مجردة. كل من A و B قد تختلف. يمكنك استخدام نمط بريدج.

وأعتقد أن هناك اختلاف طفيف بينهما في سياق انهم المستخدمة.

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

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

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