سؤال

لقد تم البحث في الفرق بين هذه الأنماط.

أنا أفهم أن الواجهة بتغليف الوصول إلى النظام الفرعي الوسيط بتغليف التفاعلات بين المكونات.

أنا أفهم أن sub مكونات النظام ليسوا على بينة من الواجهة ، حيث المكونات ومن الواضح أن علم الوسيط.

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

ومع ذلك ، فإن معظم المواقع تشير إلى أن الوسيط "يضيف وظائف".ماذا يعني هذا ؟ كيف الوسيط إضافة وظيفة ؟

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

المحلول

معظم المواقع تشير إلى أن الوسيط "يضيف وظائف"...

على الواجهة فقط يعرض الوظائف الموجودة من منظور مختلف.

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

خذ المثال التالي:

لديك تسجيل النظام.من أن نظام التسجيل يمكنك إما تسجيل الدخول إلى ملف ، إلى مأخذ ، أو إلى قاعدة البيانات الخاصة بنا.

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

رمز العميل:

 Logger logger = new Logger();
 logger.initLogger("someLogger");
 logger.debug("message");

تنفيذ قد تنطوي على التفاعل بين العديد من الكائنات.ولكن في النهاية, وظائف موجود بالفعل.ربما "تصحيح" طريقة تنفيذها على النحو التالي:

التنفيذ:

 class Logger { 

      private LoggerImpl internalLogger;
      private LoggerManager manager;

      public void initLogger( String loggerName ) {
          this.internalLogger = manager.getLogger( loggerName ); 
      }

      public void debug( String message ) { 
          this.internalLogger.debug( message );
      }     
 }

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

في ناحية أخرى الوسيط إضافة وظائف جديدة من خلال الجمع بين مختلف الكائنات.

نفس رمز العميل:

 Logger logger = new Logger();
 logger.initLogger("someLogger");
 logger.debug("message");

التنفيذ:

 class Logger { 

      private java.io.PrintStream out;
      private java.net.Socket client;
      private java.sql.Connection dbConnection;
      private String loggerName;


      public void initLogger( String loggerName ) {
               this.loggerName = loggerName;
               if ( loggerName == "someLogger" ) { 
                    out = new PrintStream( new File("app.log"));
               } else if ( loggerName == "serverLog" ) { 
                    client = new Socket("127.0.0.1", 1234 );
               } else if( loggerName == "dblog") { 
                    dbConnection = Class.forName()... .
               }

      }

      public void debug( String message ) { 

               if ( loggerName == "someLogger" ) { 
                    out.println( message );
               } else if ( loggerName == "serverLog" ) { 
                    ObjectOutputStrewam oos = 
                           new ObjectOutputStrewam( client.getOutputStream());
                    oos.writeObject( message );
               } else if( loggerName == "dblog") { 
                    Pstmt pstmt = dbConnection.prepareStatment( LOG_SQL );
                    pstmt.setParameter(1, message );
                    pstmt.executeUpdate();
                    dbConnection.commit();
               }
      }
 }

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

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

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

آمل أن يساعد هذا.

نصائح أخرى

أنا باستخدام الوسيط لإضافة ملف السجل الوظيفي.

وهي تعمل مثل هذا:

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

وتحت أنماط ذات الصلة، صندوق جلوبل القناص يقول: واجهة (185) يختلف عن وسيط لأنه يجرد فرعي من الكائنات ل توفير واجهة أكثر ملاءمة. البروتوكول الملحق بها هو أحادي الاتجاه. وهذا هو، وكائنات واجهة تجعل طلبات الطبقات الفرعي ولكن ليس العكس. في المقابل، الوسيط تمكن السلوك التعاوني أن الأجسام زميل لا أو لا يمكن أن تقدم، والبروتوكول هو متعدد الاتجاهات.

اتخاذ مقارنة بسيطة:

الواجهة:مثل موقف السيارات عند الاتصال

parkingLot.Out(car1);

ماب تكون بسيطة سلسلة الأعمال:

{
  car1.StartEngin();      
  attendant.charge();
  car1.driverOut();
}

الوسيط:مثل ضوء حركة المرور.

هناك تفاعلات بين ضوء السيارة ،

والسيارات لسيطرة الدولة.

اعتقد هذا هو الوسيط "يضيف وظائف"


و عن التعريف:

واجهة نوع: الهيكلية

الوسيط نوع: السلوكية

واجهة أكثر قلقا بشأن المكونات كانت الواردة في واجهة موحدة,

و الوسيط القلق كيف مجموعة من الكائنات التفاعل.

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

ومن "أنماط تصميم" الكتاب، وصفت KEY من نمط الوسيط على النحو التالي: "انه (الوسيط) بمثابة HUB من الاتصالات من أجل الحاجيات (أي، 'ا' مجموعة من الكائنات مترابطة)."

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

في المقابل، واجهة هو "واجهة موحدة" لمجموعة من واجهات في النظام الفرعي - للاستخدام من قبل المستهلكين من النظام الفرعي - وليس بين مكونات النظام الفرعي

يمكنك العثور على تفاصيل حول واجهة نمط في هذا SE السؤال:

ما هو الواجهة نمط التصميم ؟

Facade يوفر بسيطة و موحدة واجهة النظام المعقد.

العالم الحقيقي سبيل المثال (كليرتريب الطيران+حجز الفندق) متوفر في هذا المنصب:

ما هو الواجهة نمط التصميم ؟

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

مثال حقيقي على شبكة طبولوجيا شبكة الاتصال التي تم توفيرها في أدناه SE السؤال:

الوسيط مقابل المراقب وجوه المنحى أنماط التصميم

بخصوص استفسارك على الوسيط يضيف المسؤولية:

  1. واجهة يوفر سوى واجهة القائمة النظم الفرعية.القائمة الفرعية نظم ليسوا على بينة من واجهة الطبقة نفسها.

  2. الوسيط يعرف عن زميل الكائنات.فإنه يتيح التواصل بين الزملاء.في المثال كنت قد نقلت في ربط السؤال ، ConcreteMediator(NetworkMediator) يرسل إشعارات تسجيل وإلغاء تسجيل الحدث من أحد الزملاء إلى جميع الزملاء الآخرين.

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

على الواجهة نمط يستخدم عندما تريد توفير بسيطة و محددة واجهة لمجموعة من الكائنات التي لديها مجمع العامة واجهة.

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

تطوير البرمجيات رشيق والمبادئ أنماط وممارسات روبرت C.مارتن.

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