คำนิยาม
โหมดอะแดปเตอร์ (อะแดปเตอร์) คือการแปลงอินเทอร์เฟซ (เมธอดหรือแอตทริบิวต์) ของคลาส (วัตถุ) เป็นอินเทอร์เฟซอื่น (วิธีการหรือแอตทริบิวต์) ที่ลูกค้าต้องการ โหมดอะแดปเตอร์อนุญาตให้คลาสเหล่านั้น (วัตถุ) ซึ่งเดิมไม่สามารถทำงานร่วมกันได้เนื่องจากความไม่ลงรอยกันของอินเทอร์เฟซ ห่อหุ้มอย่างรวดเร็ว
นามแฝงสำหรับอะแดปเตอร์เป็นเสื้อคลุมซึ่งเป็นรูปแบบที่ค่อนข้างง่าย มีสถานการณ์มากมายในการพัฒนาโปรแกรม: เมื่อเราพยายามเรียกอินเทอร์เฟซของโมดูลหรือวัตถุเราพบว่ารูปแบบของอินเทอร์เฟซนี้ไม่เป็นไปตามข้อกำหนดปัจจุบัน มีวิธีแก้ปัญหาสองวิธีในเวลานี้ สิ่งแรกคือการปรับเปลี่ยนการใช้งานอินเทอร์เฟซดั้งเดิม แต่ถ้าโมดูลดั้งเดิมมีความซับซ้อนมากหรือโมดูลที่เราได้รับคือรหัสบีบอัดที่เขียนโดยคนอื่นการแก้ไขอินเทอร์เฟซดั้งเดิมจะไม่สมจริง วิธีที่สองคือการสร้างอะแดปเตอร์และแปลงอินเทอร์เฟซดั้งเดิมเป็นอินเทอร์เฟซอื่นที่ลูกค้าต้องการ ลูกค้าต้องจัดการกับอะแดปเตอร์เท่านั้น
ทำไมคุณต้องใช้โหมดอะแดปเตอร์?
เมื่อพัฒนาแอปพลิเคชันคุณมักจะต้องแทนที่ส่วนหนึ่งของมันเช่นไลบรารีที่คุณใช้เพื่อเก็บบันทึกหรือเนื้อหาที่คล้ายกัน เมื่อคุณแทนที่ด้วยไลบรารีใหม่มันไม่น่าเป็นไปได้ที่ไลบรารีใหม่จะมีอินเทอร์เฟซเดียวกันที่แน่นอน จากที่นี่คุณมีสองตัวเลือก:
(1) ตรวจสอบรหัสทั้งหมดและเปลี่ยนรหัสทั้งหมดที่ชี้ไปที่ไลบรารีเก่า
(2) สร้างอะแดปเตอร์เพื่อให้ไลบรารีใหม่สามารถใช้อินเทอร์เฟซเดียวกันกับไลบรารีเก่า
เห็นได้ชัดว่าในบางกรณีหากแอปพลิเคชันของคุณมีขนาดเล็กหรือมีการอ้างอิงถึงไลบรารีเก่าเพียงไม่กี่รายการก็เหมาะสมกว่าที่จะตรวจสอบรหัสที่สมบูรณ์และเปลี่ยนให้ตรงกับไลบรารีใหม่แทนที่จะเพิ่มเลเยอร์นามธรรมใหม่เพื่อให้รหัสซับซ้อนยิ่งขึ้น อย่างไรก็ตามในกรณีส่วนใหญ่การสร้างอะแดปเตอร์นั้นใช้งานได้จริงและประหยัดเวลามากขึ้น
ตัวอย่างรหัส JavaScript
เมื่อมีบางสิ่งเกิดขึ้นมันจะเกิดขึ้นอย่างแน่นอน ก่อนอื่นลองดูที่ LoggerFactory เล็ก ๆ นี้ซึ่งช่วยให้เราสามารถปรับเปลี่ยนอินเทอร์เฟซบันทึกที่เราใช้ได้ง่ายขึ้น
var loggerFactory = {getLogger: function () {return window.console; }, ... };/* ตัวอย่างการใช้งาน*/var logger = loggerFactory.getLogger (); logger.log ("สิ่งที่จะบันทึก");เมื่อเราเรียก getLogger มันจะส่งคืนวัตถุคอนโซล (คอนโซล) ให้เรา สำหรับแบบฝึกหัดนี้เราแกล้งทำเป็นว่าวัตถุคอนโซลมีเพียงวิธีเดียวเท่านั้น - บันทึกและสามารถรับพารามิเตอร์ประเภทสตริงเดียวเท่านั้น ต่อไปเรามีอินเทอร์เฟซบันทึกอื่นซึ่งจะซับซ้อนมากขึ้นเนื่องจาก 1) มันถูกนำไปใช้ใน JavaScript ซึ่งแตกต่างจากคอนโซลซึ่งไม่ใช่เบราว์เซอร์เอง 2) มันจะส่งบันทึกไปยังเซิร์ฟเวอร์ผ่าน AJAX ซึ่งหมายความว่าเราต้องเข้ารหัสข้อมูล URL (รหัสจะไม่ใช้การเข้ารหัส URL โดยเฉพาะเพราะมันไม่มีอะไรเกี่ยวข้องกับรูปแบบอะแดปเตอร์ที่เราต้องการพูดคุย) แน่นอนว่าจะใช้อินเทอร์เฟซที่แตกต่างจากคอนโซล
var ajaxlogger = {sendlog: function () {var data = this.urlencode (อาร์กิวเมนต์); jQuery.ajax ({url: "http://example.com/log", ข้อมูล: data}); }, urlencode: ฟังก์ชัน (arg) {... return encodedData; -เราใช้คำขอ AJAX ของ JQuery ส่วนใหญ่เพื่อประหยัดเวลาและเพิกเฉยต่อสิ่งที่เราไม่ต้องการทำกับโหมดอะแดปเตอร์ สิ่งที่เราต้องทำตอนนี้คือสร้างอะแดปเตอร์และเปลี่ยน LoggerFactory ก่อนหน้าเพื่อส่งคืนอะแดปเตอร์นี้แทนวัตถุคอนโซล
var ajaxloggeradapter = {log: function (arg) {ajaxlogger.sendlog (arg); }};/ * ปรับ loggerFactory */var loggerFactory = {getLogger: function () {// เปลี่ยนค่าส่งคืนค่าส่งคืน ajaxloggeradapter; -เราทำการเปลี่ยนแปลงเพียงบรรทัดเดียวกับรหัสที่มีอยู่และโปรแกรมทั้งหมดสามารถใช้อินเตอร์เฟสบันทึกใหม่นี้
อะแดปเตอร์ที่ซับซ้อน
อินเตอร์เฟสบันทึกเป็นตัวอย่างที่ง่ายมาก มีเพียงวิธีเดียวเท่านั้นและไม่ยากที่จะแมปโดยตรงกับวิธีเก่า นี่ไม่ใช่กรณีส่วนใหญ่ คุณอาจพบปัญหาที่พารามิเตอร์ของฟังก์ชั่นที่แมปเหล่านี้แตกต่างกันอย่างสิ้นเชิงและอินเทอร์เฟซเก่าอาจไม่มีพารามิเตอร์เหล่านี้เลยและคุณต้องจัดการกับพวกเขาด้วยตัวเอง ในบางกรณีคุณต้องลบพารามิเตอร์บางอย่างเนื่องจากอินเทอร์เฟซใหม่ไม่ได้ใช้เลย หากการแมปอินเทอร์เฟซระหว่างสองวัตถุนั้นยากเกินไปเราต้องคิดถึงวิธีอื่น ๆ อย่างไรก็ตามฉันไม่ต้องการค้นหาและแก้ไขรหัสเก่าหลายพันบรรทัด