سؤال

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

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

المحلول

يعد كل من Proxy وDecorator وAdapter وBridge جميعها أشكالًا مختلفة لـ "تغليف" الفصل الدراسي.لكن استخداماتها مختلفة.

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

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

  • مشترك كهربائي يتم استخدامه عندما يكون لديك واجهة مجردة، وتريد تعيين تلك الواجهة إلى كائن آخر له دور وظيفي مماثل، ولكن واجهة مختلفة.

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

  • مظهر زائف هو مستوى أعلى (اقرأ:أبسط) واجهة لنظام فرعي من فئة واحدة أو أكثر.لنفترض أن لديك مفهومًا معقدًا يتطلب تمثيل كائنات متعددة.إن إجراء تغييرات على مجموعة الكائنات هذه أمر مربك، لأنك لا تعرف دائمًا الكائن الذي لديه الطريقة التي تحتاج إلى الاتصال بها.هذا هو الوقت المناسب لكتابة واجهة توفر أساليب عالية المستوى لجميع العمليات المعقدة التي يمكنك إجراؤها على مجموعة الكائنات.مثال:نموذج المجال لقسم المدرسة، مع أساليب مثل countStudents(), reportAttendance(), assignSubstituteTeacher(), ، وما إلى ذلك وهلم جرا.

نصائح أخرى

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

وكذلك هياكلهم.

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

  • مشترك كهربائي و مظهر زائف كلاهما لهما واجهة مختلفة عن تلك التي يلتفان بها.لكن المحول مشتق من واجهة موجودة، بينما تقوم الواجهة بإنشاء واجهة جديدة.

  • كوبري و مشترك كهربائي كلاهما يشير إلى نوع موجود.لكن الجسر سيشير إلى نوع مجرد، وقد يشير المحول إلى نوع ملموس.سيسمح لك الجسر بإقران التنفيذ في وقت التشغيل، في حين أن المحول لن يفعل ذلك عادةً.

رأيي في الموضوع .

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

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

مشترك كهربائي

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

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

تعمل المحولات على حماية فريق واحد من التعليمات البرمجية المتطايرة من الفرق الأخرى؛أداة منقذة للحياة عند التعامل مع الفرق الخارجية ;-)

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

يساعد المحول في التغلب على قيود Java الخاصة بالميراث الفردي فقط.يمكنه الجمع بين عدة متكيفات تحت مظروف واحد مما يعطي انطباعًا بالميراث المتعدد.

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

لا توجد أمثلة كثيرة جيدة للمحولات في JDK أو المكتبات الأساسية.يقوم مطورو التطبيقات بإنشاء محولات لتكييف المكتبات مع واجهات التطبيقات المحددة.

ديكور

لا يقتصر دور الديكور على التفويض، ولا يقوم فقط بتعيين أسلوب إلى آخر، بل يفعل المزيد، ويقوم بتعديل سلوك بعض أساليب الموضوع، ويمكنه أن يقرر عدم استدعاء أسلوب الموضوع على الإطلاق، أو التفويض إلى كائن مختلف، أو كائن مساعد.

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

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

تتوفر أمثلة الكتب النصية لعائلة مصممي الديكور بأكملها بسهولة في JDK - Java IO.جميع الطبقات مثل BufferedOutputStream, FilterOutputStream و ObjectOutputStream هم الديكور تيار الإخراج.يمكن أن تكون عبارة عن طبقات من البصل، حيث يتم تزيين ديكور واحد مرة أخرى، مما يضيف المزيد من الوظائف.

الوكيل

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

معظم الأمثلة النموذجية هي الوكلاء البعيدون ومهيئات الكائنات الثقيلة ووكلاء الوصول.

  • الوكيل البعيد - الموضوع موجود على خادم بعيد أو JVM مختلف أو حتى غير موجود نظام جافا.يترجم الوكيل استدعاءات الأسلوب إلى مكالمات RMI / REST / SOAP أو كل ما هو مطلوب ، وحماية العميل من التعرض للأساس الأساسي التقنية.

  • Proxy Lazy Load Proxy - تهيئة الكائن بالكامل فقط الاستخدام الأول أو الاستخدام المكثف الأول.

  • وكيل الوصول - التحكم في الوصول إلى الموضوع.

مظهر زائف

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

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

كوبري

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

الاختلافات في الصانعين

تكون اختلافات الأنماط واضحة أيضًا عند النظر إلى منشئيها.

  • الوكيل لا يتم التفاف كائن موجود.لا يوجد موضوع في المنشئ.

  • ديكور و مشترك كهربائي لا يلتف كائن موجود بالفعل، وهذا هو عادة
    المقدمة في المنشئ.

  • مظهر زائف يأخذ المنشئ عنصر الجذر في رسم بياني كائن كامل ، وإلا فإنه يبدو مثل المحول.

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

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

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

وأنا أوصي به!

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

أنا سوف تزيين النقاط الرئيسية.

مصمم الديكور:

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

على سبيل المثال(مع تسلسل): java.io فئات الحزمة ذات الصلة InputStream & OutputStream واجهات

FileOutputStream fos1 = new FileOutputStream("data1.txt");  
ObjectOutputStream out1 = new ObjectOutputStream(fos1);

الوكيل:

  1. استخدمه للتهيئة البطيئة وتحسين الأداء عن طريق تخزين الكائن مؤقتًا والتحكم في الوصول إلى العميل/المتصل.قد يوفر سلوكًا بديلاً أو يستدعي كائنًا حقيقيًا.أثناء هذه العملية، قد يقوم بإنشاء كائن جديد.
  2. على عكس ديكور, ، والذي يسمح بتسلسل الكائنات، Proxy لا يسمح بالتسلسل.

على سبيل المثال: java.rmi فئات الحزمة.

مشترك كهربائي:

  1. فهو يسمح لواجهتين غير مرتبطتين بالعمل معًا من خلال كائنات مختلفة, ، وربما يلعب نفس الدور.
  2. يقوم بتعديل الواجهة الأصلية.

على سبيل المثال java.io.InputStreamReader (InputStream يعود أ Reader)

كوبري:

  1. فهو يسمح لكل من التجريدات والتطبيقات بالاختلاف بشكل مستقل.
  2. يستخدم التكوين على الميراث.

على سبيل المثالفئات التجميع في java.util. List التي تنفذها ArrayList.

الملاحظات الرئيسية:

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

قم بإلقاء نظرة على أسئلة/مقالات SE الرائعة المتعلقة بأمثلة لأنماط التصميم المختلفة

متى تستخدم نمط الديكور؟

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

الاختلافات بين نمط الوكيل ونمط الديكور

وكانت متشابهة جدا، وخطوط بينهما والرمادي تماما. أقترح عليك قراءة وكيل نمط و <لأ href = "http://c2.com / المجموعة الاستشارية لاندونيسيا / ويكي؟ DecoratorPattern "يختلط =" نوفولو noreferrer "> ديكور نمط الإدخالات في ويكي C2.

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

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

هذا اقتباس منرئيس أنماط التصميم الأول

التعاريف تنتمي إلى الكتاب.الأمثلة تنتمي لي.

ديكور - لا يغير الواجهة، لكنه يضيف المسؤولية.افترض أن لديك واجهة سيارة ، عند تنفيذ هذا لطراز مختلف من السيارة (S ، SV ، SL) ، قد تحتاج إلى ذلك إضافة المزيد من المسؤولية لبعض النماذج.مثل فتحة السقف والوسادة الهوائية وغيرها..

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

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

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

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

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

وعن طريق اختلاف الواجهة بين الأجسام الداخلية والخارجية:

  • في الوكيل واجهات هي نفسها.
  • في ديكور واجهات هي نفسها.
  • في مشترك كهربائي تختلف الواجهات شكليًا، ولكنها تؤدي نفس الغرض.
  • في كوبري واجهات مختلفة من الناحية المفاهيمية.

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

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

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

شيء آخر، الوكيل يفعل بالضبط ما يفعله الهدف بينما تضيف الأنماط الأخرى المزيد من الوظائف إلى الهدف.

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

الأجزاء المقتبسة من إجابة [https://stackoverflow.com/a/350471/1984346] (بيل كاروينج)

يعد كل من Proxy وDecorator وAdapter وBridge جميعها أشكالًا مختلفة لـ "تغليف" الفصل الدراسي.لكن استخداماتها مختلفة.

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

يجب أن يقوم كل من ProxyClass وObjectClass الوكيل بتنفيذ نفس الواجهة، بحيث يكونان قابلين للتبديل

مثال - وكيل كائن باهظ الثمن

class ProxyHumanGenome implements GenomeInterface  {
    private $humanGenome = NULL; 

    // humanGenome class is not instantiated at construct time
    function __construct() {
    }

    function getGenomeCount() {
        if (NULL == $this->humanGenome) {
            $this->instantiateGenomeClass(); 
        }
        return $this->humanGenome->getGenomeCount();
    }
} 
class HumanGenome implement GenomeInterface { ... }
  • ديكور يسمى أيضا "الوكيل الذكي". يتم استخدام هذا عندما تريد إضافة وظائف إلى كائن، ولكن ليس عن طريق توسيع نطاق هذا الكائن نوع.وهذا يسمح لك بالقيام بذلك في وقت التشغيل.

يجب (يمكن) أن يقوم DecoratorClass بتنفيذ الواجهة الموسعة لـ ObjectClass.لذلك يمكن استبدال فئة ObjectClass بـ DecoratorClass، ولكن ليس العكس.

مثال - إضافة وظيفة الإضافة

class DecoratorHumanGenome implements CheckGenomeInterface  {

    // ... same code as previous example

    // added functionality
    public function isComplete() {
        $this->humanGenome->getCount >= 21000
    }
}

interface CheckGenomeInterface extends GenomeInterface {

    public function isComplete();

}

class HumanGenome implement GenomeInterface { ... }
  • مشترك كهربائي عندما يكون لديك واجهة مجردة ، وتريد ذلك قم بتعيين هذه الواجهة إلى كائن آخر له وظيفة مماثلة دور ، ولكن واجهة مختلفة.

اختلافات التنفيذ: الوكيل، الديكور، المحول

يوفر المحول واجهة مختلفة لموضوعه.يوفر الوكيل نفس الواجهة.يوفر Decorator واجهة محسنة.

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

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

معظم المعلومات في هذه الإجابة هي من https://sourcemaking.com/design_patterns, ، والذي أوصي به باعتباره مورد ممتاز لأنماط التصميم.

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            /* Proxy */

            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("PROXY");
            Console.WriteLine(Environment.NewLine);

            //instead of creating here create using a factory method, the facory method will return the proxy
            IReal realProxy = new RealProxy();
            Console.WriteLine("calling do work with the proxy object ");
            realProxy.DoWork();

            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("ADAPTER");
            Console.WriteLine(Environment.NewLine);

            /*Adapter*/
            IInHand objectIHave = new InHand();
            Api myApi = new Api();
            //myApi.SomeApi(objectIHave); /*I cant do this, use a adapter then */
            IActual myAdaptedObject = new ActualAdapterForInHand(objectIHave);
            Console.WriteLine("calling api with  my adapted obj");
            myApi.SomeApi(myAdaptedObject);


            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("DECORATOR");
            Console.WriteLine(Environment.NewLine);

            /*Decorator*/
            IReady maleReady = new Male();
            Console.WriteLine("now male is going to get ready himself");
            maleReady.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady femaleReady = new Female();
            Console.WriteLine("now female is going to get ready her self");
            femaleReady.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady maleReadyByBeautician = new Beautician(maleReady);
            Console.WriteLine("now male is going to get ready by beautician");
            maleReadyByBeautician.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady femaleReadyByBeautician = new Beautician(femaleReady);
            Console.WriteLine("now female is going to get ready by beautician");
            femaleReadyByBeautician.GetReady();

            Console.WriteLine(Environment.NewLine);

            Console.ReadLine();


        }
    }

    /*Proxy*/

    public interface IReal
    {
        void DoWork();
    }

    public class Real : IReal
    {
        public void DoWork()
        {
            Console.WriteLine("real is doing work ");
        }
    }


    public class RealProxy : IReal
    {
        IReal real = new Real();

        public void DoWork()
        {
            real.DoWork();
        }
    }

    /*Adapter*/

    public interface IActual
    {
        void DoWork();
    }

    public class Api
    {
        public void SomeApi(IActual actual)
        {
            actual.DoWork();
        }
    }

    public interface IInHand
    {
        void DoWorkDifferently();
    }

    public class InHand : IInHand
    {
        public void DoWorkDifferently()
        {
            Console.WriteLine("doing work slightly different ");
        }
    }

    public class ActualAdapterForInHand : IActual
    {
        IInHand hand = null;

        public ActualAdapterForInHand()
        {
            hand = new InHand();
        }

        public ActualAdapterForInHand(IInHand hnd)
        {
            hand = hnd;
        }

        public void DoWork()
        {
            hand.DoWorkDifferently();
        }
    }

    /*Decorator*/

    public interface IReady
    {
        void GetReady();
    }

    public class Male : IReady
    {
        public void GetReady()
        {
            Console.WriteLine("Taking bath.. ");
            Console.WriteLine("Dress up....");
        }
    }

    public class Female : IReady
    {
        public void GetReady()
        {
            Console.WriteLine("Taking bath.. ");
            Console.WriteLine("Dress up....");
            Console.WriteLine("Make up....");
        }
    }

    //this is a decorator
    public class Beautician : IReady
    {
        IReady ready = null;

        public Beautician(IReady rdy)
        {
            ready = rdy;
        }

        public void GetReady()
        {
            ready.GetReady();
            Console.WriteLine("Style hair ");

            if (ready is Female)
            {
                for (int i = 1; i <= 10; i++)
                {
                    Console.WriteLine("doing ready process " + i);
                }

            }
        }
    }

}

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

والتركيز وبالتالي أكثر على مبادئ desighn الصلبة والمبادئ الترميز نظيفة وTTD

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