التعريف: تغليف سلسلة من تفاعلات الكائن مع كائن وسيط. يجعل الوسيط كل كائن يتفاعل بدون عرض ، وبالتالي تخفيف الاقتران وتغيير التفاعل بينهما بشكل مستقل.
النوع: مخطط فئة نمط السلوك:
هيكل النموذج الوسيط
يسمى الوضع الوسيط أيضًا وضع الوسيط. من مخطط الفصل ، ينقسم إلى 3 أجزاء:
الوسيط التجريدي: تحديد الواجهة بين كائنات فئة الزميل وكائنات الوسيط ، ويستخدم للتواصل بين كل فصل زميل. بشكل عام ، فإنه يتضمن طرقًا أو عدة طرق مجردة ويتم تنفيذها بواسطة الفئات الفرعية.
فئة التنفيذ الوسيطة: موروثة من الوسطاء التجريديين وتنفس أساليب الأحداث المحددة في الوسطاء التجريديين. تلقي رسائل من فصل زميل واحد ثم تؤثر على فصول أخرى متزامنة من خلال الرسالة.
فئة الزميل: إذا كان كائن يؤثر على كائنات أخرى ويتأثر أيضًا بالكائنات الأخرى ، فإن هذين الكائنين يسمى فصول الزميل. في الرسم البياني الفصل ، لا يوجد سوى فصل واحد من زملائه ، وهو في الواقع إغفال للواقع. في التطبيقات العملية ، تتكون فئة الزميل عمومًا من متعددة ، وتؤثر على بعضها البعض. كلما زاد عدد الزملاء هناك ، كلما زاد تعقيد العلاقات. علاوة على ذلك ، يمكن أيضًا تمثيل فئة الزميل كمجموعة من التطبيقات التي ترث نفس الفئة التجريدية. في النموذج الوسيط ، يجب أن تنتقل الرسالة من خلال الوسطاء بين الزملاء.
لماذا تستخدم النموذج الوسيط
بشكل عام ، العلاقة بين فصول الزميل معقدة نسبيًا. عندما ترتبط فصول زملاء متعددة ، ستظهر علاقتهم كهيكل شبكي معقد. هذه بنية مفرطة في الارتباط ، أي أنها لا تفضي إلى إعادة استخدام الطبقة وليس مستقرة. على سبيل المثال ، في الشكل أدناه ، هناك ستة كائنات تشبه الزملاء. إذا تغير الكائن 1 ، فستتأثر 4 كائنات. إذا تغير الكائن 2 ، فستتأثر 5 كائنات. وبعبارة أخرى ، فإن تصميم الارتباط المباشر بين الزملاء ليس جيدًا.
إذا تم تقديم النموذج الوسيط ، فستصبح العلاقة بين فصول الزميل هيكلًا نجومًا. من الشكل ، يمكننا أن نرى أن التغييرات في أي فئة ستؤثر فقط على الفصل نفسه والوسيط ، مما سيقلل من اقتران النظام. من المؤكد أن التصميم الجيد لن يتغلف من منطق معالجة العلاقة بين الكائنات في هذه الفئة ، ولكنه سيستخدم فئة خاصة لإدارة السلوكيات التي لا تنتمي إليك.
مثال
فيما يلي مثال رمز محدد. بالمقارنة مع مخطط الطبقة العامة ، تمت إضافة فئة زميل AbstractColleague Abstract والوسيط التجريدي المجردة. بالإضافة إلى ذلك ، هناك فصلين محددين من الزملاء ووسيط واحد محدد. هناك العديد من التعليقات في الكود ، ولا يتم إعطاء مخطط الفصل المقابل ، والذي لا ينبغي أن يكون من الصعب فهمه:
زملاء:
. /** نظرًا لوجود وسيط ، يجب أن يكون لكل زميل محدد اتصال مع الوسيط ،*خلاف ذلك ، ليست هناك حاجة إلى الوجود في هذا النظام. المُنشئ هنا يعادل تسجيل وسيط لدى النظام للوصول إلى اللمس*/ Public AbstractColleAgue (MortcerMediator Mistor) {this. Mediator = Mediator ؛ } // أضف طريقة للاتصال بالوسيط (أي التسجيل) في فئة الزميل المجردة الفراغ العام setMediator (MortcerMediator Mediator) {this.dediator = mediator ؛ }} // زميل محدد يمتد زميل في الصف الملخص {// كل زميل محدد يتصل بالوسيط من خلال زميله العام من فئة الوالدين (MortcerMediator Mediator) {Super (MEDIATR) ؛ } // يجب أن يكون لكل زميل محدد مهامه الخاصة ، وليس هناك حاجة إلى الارتباط مع العالم الخارجي الفراغ العام () {system.out.println ("زميل - } // يحتاج كل زميل محدد دائمًا إلى التفاعل مع العالم الخارجي ، والتعامل مع هذا المنطق وترتيب العمل من خلال الوسيط العام void out () {system.out.println ("زميل-> طلب زميل ب بدوام جزئي ...") ؛ super.mediator.execute ("زميل" ، "الذات") ؛ }} // زميل محدد من زميله في الفئة يمتد ملخص {public CollegeB (MortcerMediator Mediator) {Super (MEDIATR) ؛ } public void self () {system.out.println ("الزميل B-> قم بعملك بدوام جزئي ...") ؛ } public void out () {system.out.println ("الزميل B-> طلب زميله للقيام بعمله بدوام جزئي ...") ؛ super.dediator.execute ("colleaGuea" ، "Self") ؛ }} فئة الوسيطة:
. // يمكن للوسيط إنشاء اتصال ديناميكي مع زميل باطل عام addColleaGue (اسم السلسلة ، الملخص ColleaGue c) {this.colleagues.put (name ، c) ؛ } // يمكن للوسيط أيضًا إلغاء الاتصال ديناميكيًا مع زميل باطل public deletecolleaGue (اسم السلسلة) {this.colleagues.remove (name) ؛ } // يجب أن يكون للوسيط عمليات للتعامل مع المنطق ، وتعيين المهام ، وتعزيز التواصل بين الزملاء المجردة المجردة الفراغ (اسم السلسلة ، طريقة السلسلة) ؛ }. (colleaGuea) super.colleagues.get ("colleaGuea") ؛ زميل. } آخر {زميل زميل = (زميل) super.colleagues.get ("زميل") ؛ زميل. }} آخر {// college مع زملاء آخرين إذا ("clameaGuea" .equals (name)) زميل. } آخر {زميل زميل = (زميل) super.colleagues.get ("زميل") ؛ زميل. }}}}} فئة الاختبار:
// اختبار الفئة العامة العميل {public static void main (string [] args) {// إنشاء وسيط agressediator الوسيط = وسيط جديد () ؛ // إنشاء زملاء زملاء زملاء = زميل جديد (وسيط) ؛ زميل زميل = زميل جديد (وسيط) ؛ // ينشئ الوسيط اتصالًا مع كل زميل وسيط. MEDIATR.ADDCOLLEAGUE ("زميل" ، زميل) ؛ // الزملاء يبدأون في العمل colleaGuea.out () ؛ System.out.println ("=========================================================================================================================================== ============================================================= =============================================================== ============================================================= =============================================================== =============================================================== =============================================================== نتائج الاختبار:
الزميل أ -> افعل دورك في واجباتك ... زميلك أ -> اطلب من زميله أن يقوم بدورك في واجباتك ... الزميل ب -> هل دورك في واجباتك ... ==================================================================================================================================================================================== Colleague B --> Do your part in your duties... Colleague B --> Ask Colleague A to do your part in your duties... Colleague A --> Do your part in your duties... =================================================== Happy cooperation, the task is completed!
على الرغم من وجود فئتين فقط من زملائه في الكود أعلاه ، ويتم إنشاء زملاء فقط في فئة الاختبار ، يمكننا توسيعهما بشكل مناسب وفقًا للغرض من النموذج الوسيط ، أي إضافة فصول زميل محددة ، ثم على الوسيط أن يتحمل المزيد من المهام الثقيلة. لماذا؟ نرى أن هناك الآن مجموعة من رموز الحكم الطويلة في طريقة التنفيذ () في فئة الوسيط أعلاه. على الرغم من أنه يمكن تحلله وإضافته إلى الأساليب الخاصة الأخرى في فئة الوسيط ، إلا أن منطق الأعمال المحدد لا غنى عنه.
لذلك ، على الرغم من فصل العلاقة بين الزملاء ، فإن الوسيط نفسه غير متوافق أيضًا مع المهام فوق القصور ، لأن كل منطق العمل تقريبًا يتم شرحه للوسيط ، والذي يمكن وصفه بأنه دور "متوقع للغاية". هذه هي أوجه القصور في النموذج الوسيط.
بالإضافة إلى ذلك ، مثال الرمز أعلاه مثالي تمامًا. في بعض الأحيان ، لا يمكننا استخراج القواسم المشتركة بين "الزملاء" على الإطلاق لتشكيل فصل زميل مجردة مجردة ، مما يزيد بشكل كبير من صعوبة استخدام النموذج الوسيط.
يراجع:
نظرًا لوجود أوجه قصور في تنفيذ الكود أعلاه لـ "جمعية ثنائية الاتجاه المكشوفة في التطبيق" التي اقترحها كبار بنييلين ، وفقًا لطريقة التحسين المعطاة 2 ، قم بتعديل الكود أعلاه على النحو التالي:
زملاء معدّلون:
// class class AbstractColleAGue {protected AbstractMediator Mediator ؛ // توقف عن إنشاء اتصال مع الوسيط في المُنشئ // public AbstractColleAGue (MortcerMediator Mediator) {// this.mediator = mediator ؛ //} // إضافة طريقة إلى فئة الزميل المجردة للاتصال بالوسيط (أي التسجيل) setMediator public void (MortcerMediator Mediator) {this.mediator = midiator ؛ }} // زميل محدد ، يمتد زميل في الصف الملخص {// لا تنشئ اتصالًا مع الوسيط في المُنشئ // public collegea (Mortectediator Mediator) {// Super (MEDIATR) ؛ //} // يجب أن يكون لكل زميل محدد جزءه الخاص من دوره ، وليس هناك حاجة إلى الارتباط مع Void World Public Self () {system.out.println ("CommeaGuea -> قم بدورك من جانبه ...") ؛ } // يحتاج كل زميل محدد دائمًا إلى التفاعل مع العالم الخارجي ، والتعامل مع هذا المنطق وترتيب العمل من خلال الوسيط العام void out () {system.out.println ("زميل -> طلب زميل ب للقيام بدوره من دوره ...") ؛ super.mediator.execute ("زميل" ، "الذات") ؛ }} // زميل محدد من زميله في الفئة يمتد مجردة {// التوقف عن إنشاء اتصال مع الوسيط في المُنشئ // الزميل العام (MortcerMediator Mediator) {// super (mediator) ؛ //} public void self () {system.out.println ("commougheb -> do الجزء الخاص بك ...") ؛ } public void out () {system.out.println ("comelegueb -> اطلب من زميله القيام بدورك ...") ؛ super.dediator.execute ("colleaGuea" ، "Self") ؛ }}
وسيط معدّل:
. // يمكن للوسيط إنشاء اتصال ديناميكي مع زميل باطل عام addColleaGue (اسم السلسلة ، AbstractColleague C) {// مساعدة زملاء محددين يقومون بإنشاء جهات اتصال من الوسيط C.SetMediator (هذا) ؛ this.colleagues.put (الاسم ، ج) ؛ } // يمكن للوسيط أيضًا إلغاء الاتصال ديناميكيًا مع زميل باطل عام deletecolleague (اسم السلسلة) {this.colleagues.remove (name) ؛ } // يجب أن يكون للوسيط عمليات للتعامل مع المنطق ، وتعيين المهام ، وتعزيز التواصل بين الزملاء المجردة المجردة الفراغ (اسم السلسلة ، طريقة السلسلة) ؛ } // Client Client Client {public static static void main (string [] args) {// إنشاء وسيط متوسط mussediatiator = وسيط جديد () ؛ // يتم استخدام المُنشئ لتسجيل الوسيط لزملاء محددين للاتصال // compleauea clmeaguea = new clameaGuea (وسيط) ؛ // زميل زميل = زميل جديد (وسيط) ؛ ColleaGuea colleauea = new colleaGuea () ؛ زميل زميل = زميل جديد () ؛ // ينشئ الوسيط اتصالًا مع كل زميل وسيط. MEDIATR.ADDCOLLEAGUE ("زميل" ، زميل) ؛ // يبدأ الزملاء في العمل colleaGuea.out () ؛ System.out.println ("============================================== ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================النتائج بعد الاختبار هي نفسها كما كان قبل التعديل.