แนะนำ
โหมดอะแดปเตอร์ (อะแดปเตอร์) คือการแปลงอินเทอร์เฟซ (เมธอดหรือแอตทริบิวต์) ของคลาส (วัตถุ) เป็นอินเทอร์เฟซอื่น (วิธีการหรือแอตทริบิวต์) ที่ลูกค้าต้องการ โหมดอะแดปเตอร์อนุญาตให้คลาสเหล่านั้น (วัตถุ) ซึ่งเดิมไม่สามารถทำงานร่วมกันได้เนื่องจากความไม่ลงรอยกันของอินเทอร์เฟซ ห่อหุ้มอย่างรวดเร็ว
ข้อความ
มายกตัวอย่างกันเถอะ เป็ด (ท่าเรือ) มีพฤติกรรมของการบิน (บิน) และการต้มตุ๋น (ต้มตุ๋น) ในขณะที่ไก่งวงก็มีพฤติกรรมของการบิน (บิน) เสียงของมันก็พัด หากคุณยืนยันในการดำเนินการตามการกระทำของตุรกี (quack) ของตุรกีเราสามารถนำวิธีการหลอกลวงของเป็ดกลับมาใช้ใหม่ได้ แต่การโทรที่เฉพาะเจาะจงควรเป็นนักต้มตุ๋น ในเวลานี้เราสามารถสร้างอะแดปเตอร์ไก่งวงเพื่อให้ตุรกีรองรับวิธีการต้มตุ๋นและควรเรียกว่ากานพลันภายใน
ตกลงเราเริ่มใช้มันทีละขั้นตอน อันดับแรกเราต้องกำหนดพฤติกรรมเชิงนามธรรมของเป็ดและตุรกีนั่นคือวิธีการของพวกเขาฟังก์ชั่นของพวกเขา:
การคัดลอกรหัสมีดังนี้:
//เป็ด
var duck = function () {
-
duck.prototype.fly = function () {
โยนข้อผิดพลาดใหม่ ("วิธีนี้จะต้องเขียนใหม่!");
-
duck.prototype.quack = function () {
โยนข้อผิดพลาดใหม่ ("วิธีนี้จะต้องเขียนใหม่!");
-
//ไก่งวง
var turkey = function () {
-
Turkey.prototype.fly = function () {
โยนข้อผิดพลาดใหม่ ("วิธีนี้จะต้องเขียนใหม่!");
-
Turkey.prototype.gobble = 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 () {
ตุรกีใช้ (นี่);
-
WildTurkey.prototype = New Turkey (); // ต้นแบบคือตุรกี
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;
-
-
ตัวสร้างใช้วัตถุอินสแตนซ์ของตุรกีจากนั้นนำไปใช้โดยใช้เป็ดซึ่งมีตัวทำต้นแบบอะแดปเตอร์เป็นเป็ดและจากนั้นมันต้องการที่จะปรับเปลี่ยนวิธีการ quack ของต้นแบบใหม่เพื่อให้วิธี oturkey.gobble () เรียกว่าภายใน วิธีการบินได้ทำการเปลี่ยนแปลงบางอย่างทำให้ไก่งวงบินได้ 5 ครั้งติดต่อกัน (การโทรภายในเรียกว่าวิธีการ oturkey.fly () ของตัวเอง)
การเรียกใช้วิธีนี้ชัดเจนมาก หลังจากการทดสอบคุณจะรู้ผลลัพธ์:
การคัดลอกรหัสมีดังนี้:
var omallardduck = ใหม่ mallardduck ();
var owildturkey = new wildturkey ();
var oturkeyadapter = ใหม่ Turkeyadapter (OwildTurkey);
// พฤติกรรมเป็ดดั้งเดิม
omallardduck.fly ();
omallardduck.quack ();
// พฤติกรรมไก่งวงดั้งเดิม
owildturkey.fly ();
owildturkey.gobble ();
// Adapter Turkey Behavior (Turkey Calls Method Name)
oturkeyadapter.fly ();
oturkeyadapter.quack ();
สรุป
แล้วถ้าคุณใช้โหมดอะแดปเตอร์ล่ะ ขอแนะนำให้ใช้ถ้า:
1. ใช้วัตถุที่มีอยู่ แต่วิธีการหรือส่วนต่อประสานแอตทริบิวต์ไม่ตรงตามความต้องการของคุณ
2. คุณต้องการสร้างวัตถุที่สามารถนำกลับมาใช้ใหม่ได้ซึ่งสามารถทำงานกับวัตถุอื่น ๆ ที่ไม่เกี่ยวข้องหรือวัตถุที่มองไม่เห็น (เช่นวัตถุที่เข้ากันไม่ได้กับวิธีการเชื่อมต่อหรือแอตทริบิวต์);
3. ต้องการใช้วัตถุที่มีอยู่ แต่คุณไม่สามารถต้นแบบแต่ละตัวเพื่อให้ตรงกับอินเทอร์เฟซ อะแดปเตอร์วัตถุสามารถปรับให้เข้ากับวิธีการเชื่อมต่อวัตถุหรือคุณสมบัติ
นอกจากนี้โหมดอะแดปเตอร์และโหมดอื่น ๆ อาจทำให้เกิดความสับสน นี่คือความแตกต่างทั่วไป:
1. แม้ว่าอะแดปเตอร์และโหมดบริดจ์จะคล้ายกัน แต่จุดเริ่มต้นของสะพานก็แตกต่างกัน จุดประสงค์ของบริดจ์คือการแยกส่วนอินเทอร์เฟซและส่วนการนำไปใช้เพื่อให้สามารถเปลี่ยนแปลงได้ง่ายขึ้นและค่อนข้างอิสระ อะแดปเตอร์หมายถึงการเปลี่ยนอินเทอร์เฟซด้วยวัตถุที่มีอยู่
2. โหมดมัณฑนากรเพิ่มฟังก์ชั่นของวัตถุอื่น ๆ โดยไม่ต้องเปลี่ยนอินเทอร์เฟซดังนั้นโปรแกรมที่สอดคล้องกันจึงโปร่งใสดีกว่าอะแดปเตอร์ ผลที่ได้คือมัณฑนากรสนับสนุนชุดค่าผสมซ้ำและเป็นไปไม่ได้ที่จะใช้อะแดปเตอร์ล้วนๆ
3. โหมดพร็อกซีกำหนดพร็อกซีสำหรับวัตถุอื่นโดยไม่ต้องเปลี่ยนอินเทอร์เฟซ