يقدم
وضع المحول (محول) هو تحويل واجهة (طريقة أو سمة) لفئة (كائن) إلى واجهة أخرى (الطريقة أو السمة) التي يريدها العميل. يسمح وضع المحول بتلك الفئات (الكائنات) التي لم تتمكن في الأصل من العمل معًا بسبب عدم توافق الواجهة. غلاف سريع.
نص
دعونا نعطي مثالا. تتميز البطة (قفص الاتهام) بسلوك الطيران (ذبابة) و quacking (الدجال) ، في حين أن تركيا لديها أيضًا سلوك الطيران (ذبابة) ، صوته هو إذا كنت تصر على تنفيذ عمل Quack (Quack) من تركيا ، فيمكننا إعادة استخدام طريقة الدجال في البط ، ولكن يجب أن تكون المكالمة المحددة Quack. في هذا الوقت ، يمكننا إنشاء محول تركيا بحيث تدعم تركيا أيضًا طريقة الدجال ، ويجب أن يطلق على Gobble داخليًا.
حسنًا ، نبدأ في تنفيذها خطوة بخطوة. أولاً ، يجب أن نحدد السلوك التجريدي للبط وتركيا ، أي وظائف الطريقة الخاصة بها:
نسخة الكود كما يلي:
//بطة
var duck = function () {
} ؛
duck.prototype.fly = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
duck.prototype.quack = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
}
//ديك رومى
var turkey = function () {
} ؛
تركيا.
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
تركيا.
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
ثم حدد المنشئون المحددون للبط وتركيا ، على التوالي:
نسخة الكود كما يلي:
//بطة
var mallardduck = function () {
duck.apply (هذا) ؛
} ؛
mallardduck.prototype = new Duck () ؛ // النموذج الأولي هو بطة
mallardduck.prototype.fly = function () {
console.log ("يمكن أن تطير لمسافة طويلة!") ؛
} ؛
mallardduck.prototype.quack = function () {
console.log ("gaga! gaga!") ؛
} ؛
//ديك رومى
var wildturkey = function () {
تركيا. apply (هذا) ؛
} ؛
wildturkey.prototype = تركيا الجديدة () ؛ // النموذج الأولي هو تركيا
wildturkey.prototype.fly = function () {
console.log ("يبدو أن مسافة الطيران قصيرة قليلاً!") ؛
} ؛
wildturkey.prototype.gobble = function () {
console.log ("gee! gee!") ؛
} ؛
لجعل تركيا تدعم طريقة الدجال ، أنشأنا محول تركيا جديد ، Turkeyadapter:
نسخة الكود كما يلي:
var turkeyadapter = function (oturkey) {
duck.apply (هذا) ؛
this.oturkey = oturkey ؛
} ؛
Turkeyadapter.prototype = new Duck () ؛
Turkeyadapter.prototype.quack = function () {
this.oturkey.gobble () ؛
} ؛
turkeyadapter.prototype.fly = function () {
var nfly = 0 ؛
var nlenfly = 5 ؛
لـ (؛ nfly <nlenfly ؛) {
this.oturkey.fly () ؛
nfly = nfly + 1 ؛
}
} ؛
يأخذ المُنشئ كائن مثيل لتركيا ، ثم يطبقه باستخدام Duck ، الذي يكون النموذج الأولي الذي يكون محوله البط ، ثم يريد إعادة تعديل طريقة Quack الخاصة بنموذج النموذج الأولي بحيث تسمى طريقة oturkey.gobble () داخليًا. قامت طريقة الطيران أيضًا بإجراء بعض التغييرات ، مما سمح لتركيا بالطيران 5 مرات متتالية (تسمى المكالمة الداخلية أيضًا طريقة oturkey.fly ()).
استدعاء الطريقة واضحة للغاية. بعد الاختبار ، ستعرف النتيجة:
نسخة الكود كما يلي:
var omallardduck = new mallardduck () ؛
var owildturkey = new Wildturkey () ؛
var OturkeyAdapter = New Turkeyadapter (OwildTurkey) ؛
// سلوك البط الأصلي
omallardduck.fly () ؛
omallardduck.quack () ؛
// سلوك تركيا الأصلي
Owildturkey.fly () ؛
Owildturkey.gobble () ؛
// محول سلوك تركيا (تدعو تركيا اسم طريقة البطة)
oturkeyadapter.fly () ؛
oturkeyadapter.quack () ؛
لخص
فماذا لو كنت تستخدم وضع المحول؟ يوصى باستخدامه إذا:
1. استخدم كائن موجود ، لكن طريقة أو واجهة السمة لا تفي بمتطلباتك ؛
2. تريد إنشاء كائن قابل لإعادة الاستخدام يمكنه العمل مع كائنات أخرى غير ذات صلة أو كائنات غير مرئية (أي الكائنات التي لا تتوافق مع طرق الواجهة أو السمات) ؛
3. تريد استخدام كائن موجود ، لكن لا يمكنك النموذج الأولي لكل منهما لمطابقة واجهته. يمكن أن يتكيف محول الكائن مع طريقة أو خاصية واجهة الكائن الأم.
بالإضافة إلى ذلك ، قد يكون وضع المحول وعدة أوضاع أخرى مربكًا. هذا فرق عام:
1. على الرغم من أن وضع المحول والجسر متشابهان ، فإن نقطة انطلاق الجسر مختلفة. الغرض من الجسر هو فصل جزء الواجهة وجزء التنفيذ ، بحيث يمكن تغييرها بسهولة أكبر وذات مستقل نسبيًا. يعني المحول تغيير الواجهة بكائن موجود.
2. وضع الديكور يعزز وظائف الكائنات الأخرى دون تغيير واجهته ، وبالتالي فإن برنامجه المقابل هو أفضل من المحول. والنتيجة هي أن الديكور يدعم المجموعات العودية ، ومن المستحيل استخدام المحول بحت.
3. يحدد وضع الوكيل وكيلًا لكائن آخر دون تغيير واجهته.