يقدم
يستخدم الوسيط (الوسيط) كائن وسيط لتغليف سلسلة من تفاعلات الكائن. لا يلزم الإشارة بوضوح إلى الوسيط إلى بعضها البعض ، وبالتالي اقترانها بشكل فضفاض ويمكنها تغيير تفاعلاتها بشكل مستقل.
يأتي المحتوى الرئيسي من: http://www.addyosmani.com/resources/essentialjsdesignpatterns
نص
في تطوير البرمجيات ، يعد الوسطاء نمطًا للتصميم السلوكي يسمح لأجزاء مختلفة من النظام بالتواصل من خلال توفير واجهة موحدة. بشكل عام ، إذا كان لدى النظام العديد من العلامات الفرعية التي تحتاج إلى توصيلها مباشرة ، فيجب إنشاء نقطة تحكم مركزية لكل وحدة للتفاعل من خلال نقطة التحكم المركزية. يسمح النموذج الوسيط لهذه العوامل الفرعية بتحقيق الغرض من الفصل دون اتصال مباشر.
على سبيل المثال ، نظام مراقبة حركة المطار المشترك ، البرج هو وسيط يتحكم في إقلاع وهبوط الطائرة (الجهاز الفرعي) ، لأن جميع الاتصالات قد اكتملت من الطائرة التي تقارير إلى البرج ، بدلاً من التواصل مع بعضها البعض قبل الطائرة. نظام التحكم المركزي هو مفتاح النظام ، أي دور الوسيط في تصميم البرامج.
دعونا أولاً نفهمها باستخدام الكود الزائف:
نسخة الكود كما يلي:
// الرمز التالي هو رمز pseudo ، من فضلك لا تولي الكثير من الاهتمام للرمز
// هنا مساحة اسم التطبيق تعادل لعب دور الوسيط
var app = app || {} ؛
// تقديم طلبات Ajax من خلال التطبيق الوسيط
app.SendRequest = function (خيارات) {
إرجاع $ .ajax ($. تمديد ({} ، الخيارات) ؛
}
// بعد طلب عنوان URL ، عرض العرض
app.populateView = function (url ، view) {
دولار.
.Then (function () {
// إظهار المحتوى
}) ؛
}
// محتوى واضح
app.ResetView = function (view) {
view.html ('') ؛
}
في JavaScript ، يعتبر الوسطاء شائعون جدًا ، ومكافئين لحافلة الرسائل في نمط المراقب. ومع ذلك ، لا يتم تنفيذها عن طريق استدعاء Pub/Sub مثل المراقبين ، ولكن يتم إدارتها من قبل الوسطاء بطريقة موحدة. دعنا نعطي مثالاً على أساس المراقب:
نسخة الكود كما يلي:
var mediator = (function () {
// اشترك في حدث ما وقدم وظيفة رد اتصال بعد الحدث
var اشتراك = دالة (قناة ، fn) {
if (! mediator.channels [Channel]) MEDIATR.CHANNELS [Channel] = [] ؛
MEDIATR.CHANNELS [channel] .push ({context: this ، callback: fn}) ؛
إرجاع هذا ؛
} ،
// أحداث البث
publish = function (Channel) {
if (! mediator.channels [Channel]) return false ؛
var args = array.prototype.slice.call (الوسائط ، 1) ؛
لـ (var i = 0 ، l = mediator.channels [channel] .length ؛ i <l ؛ i ++) {
اشتراك VAR = MEDIATR.CHANNELS [Channel] [i] ؛
اشتراك. callback.apply (اشتراك.
}
إرجاع هذا ؛
} ؛
يعود {
القنوات: {} ،
النشر: نشر ،
الاشتراك: اشترك ،
installto: function (obj) {
obj.subscribe = اشتراك ؛
OBJ.Publish = publish ؛
}
} ؛
} ()) ؛
استدعاء الرمز بسيط نسبيًا:
نسخة الكود كما يلي:
(وظيفة (وسيط) {
تهيئة الدالة () {
// القيمة الافتراضية
الوسيط. name = "dudu" ؛
// اشترك في حدث namechange
// تعرض دالة رد الاتصال المعلومات قبل التعديل وبعدها
MEDIATR.Subscribe ('namechange' ، function (arg) {
console.log (this.name) ؛
this.name = arg ؛
console.log (this.name) ؛
}) ؛
}
وظيفة updatename () {
// حدث مشغل البث ، المعلمة هي بيانات جديدة
MEDIATR.Publish ('NameChange' ، 'Tom') ؛ // دودو ، توم
}
تهيئة () ؛ // تهيئة
updatename () ؛ // يتصل
}) (وسيط) ؛
الوسطاء والمراقبين
في هذه المرحلة ، قد يتم الخلط بين الجميع. يبدو أن الوسيط والمراقب متشابه. ما هو الفرق؟ إنه في الواقع مشابه بعض الشيء ، ولكن دعونا نلقي نظرة على الوصف المحدد:
نمط المراقب ، كائن واحد لا يتغلف القيود. على العكس من ذلك ، يعمل مراقب المراقب وموضوع الفئة الملموسة معًا للحفاظ على القيود. يتفاعل الاتصال من خلال عدة مراقبين وفئات خرسانية متعددة: عادة ما تحتوي كل فئة من الخرسانة على مراقبين متعددين ، وأحيانًا يكون أحد المراقبين في فئة الخرسانة هو أيضًا فئة ملموسة من مراقب آخر.
ما يفعله النموذج الوسيط ليس التوزيع ببساطة ، لكنه يلعب دور الحفاظ على هذه القيود.
أنماط الوسيطة والمظهر
قد يتم الخلط بين الكثير من الناس حول الفرق بين أنماط الوسيط والمظهر. كلاهما تجريد الوحدات النمطية الحالية ، ولكن هناك بعض الاختلافات الدقيقة.
ما يفعله الوسيط هو التواصل بين الوحدات النمطية ، وهو متعدد الاتجاهات ، ولكن وضع المظهر يحدد ببساطة واجهة بسيطة لوحدة أو نظام معين دون إضافة وظائف إضافية. ليس لمفهوم الوحدات الأخرى في النظام أي اتصال مباشر مع وضع المظهر ويمكن اعتباره في اتجاه واحد.
هنا مثال كامل آخر:
نسخة الكود كما يلي:
<! doctype html>
<html lang = "en">
<head>
<title> أنماط JavaScript </title>
<meta charset = "utf-8">
</head>
<body>
<div id = "النتائج"> </div>
<script>
مشغل الوظيفة (الاسم) {
this.points = 0 ؛
this.name = name ؛
}
player.prototype.play = function () {
this.points += 1 ؛
الوسيط.
} ؛
لوحة النتائج VAR = {
// الحاوية لعرض المحتوى
العنصر: document.getElementById ('النتائج') ،
// عرض نقاط التحديث
تحديث: وظيفة (نقاط) {
var i ، msg = '' ؛
ل (أنا في النتيجة) {
if (score.hasownproperty (i)) {
msg + = '<p> <strong>' + i + '<// strong>:' ؛
msg += score [i] ؛
msg += '<// p>' ؛
}
}
this.element.innerhtml = msg ؛
}
} ؛
var mediator = {
// جميع اللاعبين
اللاعبون: {} ،
// التهيئة
الإعداد: function () {
var players = this.players ؛
players.home = لاعب جديد ("الصفحة الرئيسية") ؛
players.guest = New Player ('Guest') ؛
} ،
// بعد اللعب ، قم بتحديث النتيجة
لعبت: وظيفة () {
var players = this.players ،
النتيجة = {
الصفحة الرئيسية: Players.home.points ،
الضيف: لاعبي
} ؛
لوحة النتائج. update (النتيجة) ؛
} ،
// التعامل مع تفاعل مفتاح المستخدم
keypress: function (e) {
e = e || window.event ؛ // أي
if (
midiator.players.home.play () ؛
يعود؛
}
if (
midiator.players.guest.play () ؛
يعود؛
}
}
} ؛
// يذهب!
الوسيط.
window.onkeypress = midiator.keypress ؛
// نهاية بعد 30 ثانية
setTimeout (function () {
window.onkeypress = null ؛
console.log ('Game Over!') ؛
} ، 30000) ؛
</script>
</body>
</html>
لخص
يستخدم الوضع الوسيط عمومًا في المواقف التي تم فيها تحديد مجموعة من الكائنات جيدًا ولكنها تتصل بطريقة معقدة. بشكل عام ، فإن الوضع الوسيط سهل الاستخدام في النظام ، ولكن من السهل أيضًا إساءة استخدامه في النظام. عندما تظهر مجموعة كائنات معقدة من التفاعلات العديدة إلى العدد في النظام ، لا تتسرع في استخدام الوضع الوسيط أولاً ، ولكن فكر فيما إذا كان هناك خطأ في تصميم النظام.
بالإضافة إلى ذلك ، نظرًا لأن النموذج الوسيط يحول تعقيد التفاعل إلى تعقيد الوسيط نفسه ، فإن الكائن الوسيط سيكون أكثر تعقيدًا من أي كائن آخر.