هل هناك نمط لنشر حالة التكوين أسفل الرسم البياني للكائن?

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

سؤال

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

المشكلة

A معقد.لتجنب "كائن الله" ، يتم دفع بعض المنطق إلى B و C.

الآن بمثابة فا إرماد.ذلك يعتمد على ب و ج.

A -> B
  -> C

ومع ذلك ، يحتوي أ على بيانات التكوين التي يحتاجها ب وج.لذلك علينا أن نحافظ على مزامنة البيانات.

b.value1 = a.value1
b.value2 = a.value2

c.value1 = a.value1
c.value2 = a.value2

أيضا ، ب و ج يجب تحويل البيانات لاستخدامها.

b.sum -> b.value1 + b.value2
b.doSomething -> b.sum() ...

c.sum -> c.value1 + c.value2
c.doSomethingElse -> c.sum() ...

لتجنب كتابة رمز مكرر ، نقوم بنقل طرق التحويل هذه مرة أخرى إلى أ.

a.sum -> a.value1 + a.value2

b.doSomething -> a.sum() ...
c.doSomethingElse -> a.sum() ...

ولكن هذا يعني ب و ج تعتمد الآن على أ ، وليس فقط بياناتها.

A -> B -> A
  -> C -> A

وهذا يؤدي إلى تبعية دائرية.

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

تحرير

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

A -> B -> D
  -> C -> D
  -> D

دال يدير value1 و value2 ويوفر sum الطريقة.د لديها أيضا الأحداث التي تطلق عندما تتغير القيمة 1 والقيمة 2 بحيث يمكن للعقد التابعة (أ ، ب ، ج) الاستجابة للتغيير.

أعتقد أن هذا الحل يعمل ، لكنني أردت النشر على أي حال في حالة وجود حل أفضل.إذا كان هذا هو نمط أنا أبحث عن, ما يسمى?نمط "المزود"?(وينبغي عدم الخلط مع ASP.NET في نموذج المزود!)

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

المحلول

هل تبحث عن مراقب أو وسيط نمط.التحقق من ذلك على http://sourcemaking.com/design_patterns/observer

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