23 وسائط التصميم 20: نموذج الوسيط Java
التعريف: تغليف سلسلة من تفاعلات الكائن مع كائن وسيط. يجعل الوسيط كل كائن يتفاعل بدون عرض ، وبالتالي تخفيف الاقتران وتغيير التفاعل بينهما بشكل مستقل.
النوع: نمط سلوكي
مخطط الفصل:
هيكل النموذج الوسيط
يسمى الوضع الوسيط أيضًا وضع الوسيط. من مخطط الفصل ، ينقسم إلى 3 أجزاء:
الوسيط التجريدي: تحديد الواجهة بين كائنات فئة الزميل وكائنات الوسيط ، ويستخدم للتواصل بين كل فصل زميل. بشكل عام ، فإنه يتضمن طرقًا أو عدة طرق مجردة ويتم تنفيذها بواسطة الفئات الفرعية.
فئة التنفيذ الوسيطة: موروثة من الوسطاء التجريديين وتنفس أساليب الأحداث المحددة في الوسطاء التجريديين. تلقي رسائل من فصل زميل واحد ثم تؤثر على فصول أخرى متزامنة من خلال الرسالة.
فئة الزميل: إذا كان كائن يؤثر على كائنات أخرى ويتأثر أيضًا بالكائنات الأخرى ، فإن هذين الكائنين يسمى فصول الزميل. في الرسم البياني الفصل ، لا يوجد سوى فصل واحد من زملائه ، وهو في الواقع إغفال للواقع. في التطبيقات العملية ، تتكون فئة الزميل عمومًا من متعددة ، وتؤثر على بعضها البعض. كلما زاد عدد الزملاء هناك ، كلما زاد تعقيد العلاقات. علاوة على ذلك ، يمكن أيضًا تمثيل فئة الزميل كمجموعة من التطبيقات التي ترث نفس الفئة التجريدية. في النموذج الوسيط ، يجب أن تنتقل الرسالة من خلال الوسطاء بين الزملاء.
لماذا تستخدم النموذج الوسيط
بشكل عام ، العلاقة بين فصول الزميل معقدة نسبيًا. عندما ترتبط فصول زملاء متعددة ، ستظهر علاقتهم كهيكل شبكي معقد. هذه بنية مفرطة في الارتباط ، أي أنها لا تفضي إلى إعادة استخدام الطبقة وليس مستقرة. على سبيل المثال ، في الشكل أدناه ، هناك ستة كائنات تشبه الزملاء. إذا تغير الكائن 1 ، فستتأثر 4 كائنات. إذا تغير الكائن 2 ، فستتأثر 5 كائنات. وبعبارة أخرى ، فإن تصميم الارتباط المباشر بين الزملاء ليس جيدًا.
إذا تم تقديم النموذج الوسيط ، فستصبح العلاقة بين فصول الزميل هيكلًا نجومًا. من الشكل ، يمكننا أن نرى أن التغييرات في أي فئة ستؤثر فقط على الفصل نفسه والوسيط ، مما سيقلل من اقتران النظام. من المؤكد أن التصميم الجيد لن يتغلف من منطق معالجة العلاقة بين الكائنات في هذه الفئة ، ولكنه سيستخدم فئة خاصة لإدارة السلوكيات التي لا تنتمي إليك.
دعنا نستخدم مثالًا لتوضيح ماهية فئة الزميل: هناك فئتان A و B ، كل منهما لديه رقم ، ويجب أن نتأكد من أن الأرقام في الفئة B دائمًا ما تكون 100 مرة في الفئة A. وهذا يعني ، عند تعديل عدد الفئة A ، مضاعفة الرقم من قبل 100 وتعيينها إلى الفئة B ، وعند تعديل الفئة B ، قسمة الرقم 100 وبين الفئة A. الرمز كما يلي:
مجردة class AbstractColleaGue {protected int number ؛ Public int getNumber () {return number ؛ } public void setNumber (int number) {this.number = number ؛ } // method method ، قم بتعديل الكائن المرتبط به في نفس الوقت عند تعديل الأرقام المجردة العامة التجريدية setNumber (رقم int ، ملخص ColleaGue) ؛ } class colleaGuea يمتد AbstractColleAgue {public void setNumber (int number ، AbstractColleaGue coll) {this.number = number ؛ Coll.SetNumber (رقم*100) ؛ }} Class CluseGBER ExtractColleAGUE {public void setNumber (int number ، ussstcolleague coll) {this.number = number ؛ Coll.SetNumber (رقم/100) ؛ }} client client client {public static void main (string [] args) {AbstractColleaGue colla = new colleaGuea () ؛ AbstractColleaGue Collb = New ComelegugeB () ؛ System.out.println ("============================================== ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ System.out.println ("قيمة رقم Collb:"+collb.getnumber ()) ؛ في الكود أعلاه ، يرتبط الفئة A و B من خلال الارتباط المباشر. إذا أردنا استخدام النموذج الوسيط ، فلا يمكن ربط الفئة A و B مباشرة. يجب عليهم استخدام وسيط لتحقيق الغرض من الارتباط.
مجردة class AbstractColleaGue {protected int number ؛ Public int getNumber () {return number ؛ } public void setNumber (int number) {this.number = number ؛ } // لاحظ أن المعلمات هنا لم تعد زملاء ، ولكنها مجموعة متوسطة عامة تجريدية تجريدية (رقم int ، AbstractMediator AM) ؛ } class colleaGuea يمتد AbstractColleAgue {public void setNumber (int number ، ustructediator am) {this.number = number ؛ Am.AaffectB () ؛ }} class classebs يمتد ملخص {Override public void setNumber (int number ، ustructionediator am) {this.number = number ؛ Am.Baffecta () ؛ }} class class AbstractMediator {protected AbstractColleAgue a ؛ محمية AbstractColleaGue B ؛ Public AbstractMediator (AbstractColleAgue A ، AbstractColleAGUE B) {a = a ؛ ب = ب ؛ } public public void aaffectb () ؛ التجريد الجمهور بافكتا () ؛ } الوسيط الفئة يمتد AbstractMediator {Public Mediator (AbstractColleAgue A ، AbstractColleAGUE B) {Super (A ، B) ؛ }. B.SetNumber (رقم*100) ؛ }. A.SetNumber (رقم/100) ؛ }} client client client {public static void main (string [] args) {AbstractColleaGue colla = new colleaGuea () ؛ AbstractColleaGue Collb = New ComelegugeB () ؛ AbstractMediator AM = وسيط جديد (Colla ، collb) ؛ System.out.println ("========================== تأثير عن طريق الإعداد a ======================================================================================= ======================================================================================== ======================================================================================== ========================================================================================= System.out.println ("قيمة رقم Colla هي:"+colla.getnumber ()) ؛ B =================================================================================== ===================================================================================== ====================================================================================== ===================================================================================== System.out.println ("قيمة رقم Collb هي:"+collb.getnumber ()) ؛على الرغم من أن الكود طويل نسبيًا ، إلا أنه لا يزال من السهل الفهم نسبيًا. في الواقع ، فإن إعادة تعبئة الكود الذي يتولى في الأصل علاقات الكائنات في فئة الوساطة ، والتعامل مع العلاقة بين الكائنات من خلال فئة الوساطة هذه.
مزايا النموذج الوسيط
1. يمكن أن يتجنب الاستخدام المناسب للنموذج الوسيط الاقتران المفرط بين فصول الزملاء ، بحيث يمكن استخدام كل فصل زميل بشكل مستقل نسبيًا.
2. يمكن أن يؤدي استخدام نمط الوسيط إلى تحويل العلاقات الفردية بين الكائنات إلى علاقات فردية ، مما يجعل العلاقات بين الكائنات سهلة الفهم والصيانة.
3. يمكن أن يؤدي استخدام النموذج الوسيط إلى تجريد سلوك الكائنات والتعاون فيها ، ويمكنها التعامل مع التفاعلات بين الكائنات بشكل أكثر مرونة.
السيناريوهات المعمول بها
في البرمجة الموجهة نحو الكائنات ، يعتمد الفصل حتماً على فئات أخرى ، والفئات المستقلة تمامًا لا معنى لها. من الشائع أيضًا أن يعتمد الفصل على فصول متعددة في نفس الوقت. نظرًا لوجود مثل هذا الموقف ، فهذا يعني أن التبعية الفردية لها عقلانية. يمكن أن يؤدي الاستخدام المناسب لنمط الوسيط إلى أن يجعل علاقة الكائن الفوضوية في الأصل واضحة ، ولكن إذا تم إساءة معاملتها ، فقد يؤدي ذلك إلى آثار سلبية. بشكل عام ، يعتبر نموذج الوسيط فقط للعلاقة بين فئات زملاء العمل حيث يوجد بنية شبكية. يمكن تحويل بنية الشبكة إلى بنية نجمة لجعل العلاقة بين الزملاء أكثر وضوحًا.
النموذج الوسيط هو نموذج شائع نسبيًا ونموذجًا سهلاً نسبياً. في معظم الحالات ، لن تكون العلاقة بين فصول الزملاء معقدة مع بنية شبكة فوضوية. لذلك ، في معظم الحالات ، لا بأس في تغليف التبعيات بين الكائنات داخل فئة الزميل ، وليس هناك حاجة لإدخال النموذج الوسيط. إن إساءة استخدام النموذج الوسيط لن يجعل الأمور أكثر تعقيدًا.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.