เรามักจะพบกับสถานการณ์นี้ ด้วยคลาสสำเร็จรูปสองชั้นไม่มีการเชื่อมต่อระหว่างพวกเขา แต่ตอนนี้เราต้องการใช้วิธีหนึ่งของชั้นเรียนและอีกชั้นหนึ่ง มีวิธีแก้ปัญหาในการปรับเปลี่ยนอินเทอร์เฟซที่เกี่ยวข้อง แต่นี่คือสิ่งที่เราต้องการเห็นน้อยที่สุด ในเวลานี้โหมดอะแดปเตอร์จะมีประโยชน์
โหมดอะแดปเตอร์เรียกว่าโหมดอะแดปเตอร์ซึ่งเป็นหนึ่งใน 23 โหมดการออกแบบที่เสนอโดย GOF โหมดอะแดปเตอร์เป็นหนึ่งในโหมดที่สร้างสรรค์ ผ่านโหมดอะแดปเตอร์รูปแบบอินเตอร์เฟสของคลาสที่มีอยู่ (หรือคลาสภายนอก) สามารถเปลี่ยนแปลงได้
มีสามวิธีในโหมดอะแดปเตอร์หนึ่งคืออะแดปเตอร์วัตถุหนึ่งคืออะแดปเตอร์คลาสและอื่น ๆ คืออะแดปเตอร์อินเตอร์เฟส
ตัวอย่างต่อไปนี้ได้รับ:
1. อะแดปเตอร์ชั้นเรียน
แผนภาพชั้นเรียน
คลาสสาธารณะ DrawRectangle {// วาดโมฆะสาธารณะเป็นโมฆะ Public DrawRectangle (String msg) {System.out.println ("วาดรูปสี่เหลี่ยมผืนผ้า:" + msg); }} อินเตอร์เฟสสาธารณะ idrawcircle {// วาดอินเตอร์เฟสวงกลมเป็นโมฆะ drawcircle (); - / ** * อะแดปเตอร์คลาสใช้การสืบทอดวัตถุซึ่งเป็นวิธีการนิยามแบบคงที่ * @author Stone * */ คลาสสาธารณะ DrawAdapter4Class ขยาย DrawRectangle ใช้ Idrawcircle {// สามารถวาดรูปสี่เหลี่ยมจัตุรัสและวงกลม -2. อะแดปเตอร์วัตถุ
แผนภาพชั้นเรียน:
/*** อะแดปเตอร์วัตถุ: วิธีการใช้การรวมกันของวัตถุเป็นวิธีการรวมแบบไดนามิก * สามารถวาดสี่เหลี่ยมและวงกลม * @author stone * Drawadapter เป็นอะแดปเตอร์, DrawRectangle เป็นของอะแดปเตอร์และเป็นอะแดปเตอร์ อะแดปเตอร์จะปรับให้เข้ากับอะแดปเตอร์และอะแดปเตอร์ (drawcircle) * */ คลาสสาธารณะ DrawAdapter4Object ใช้ IdrawCircle {// สามารถวาดรูปสี่เหลี่ยมจัตุรัสและวงกลม DrawRectAngle ส่วนตัว Public DrawAdapter4Object (DrawRectangle DrawRectangle) {this.drawRectangle = DrawRectAngle; } @Override โมฆะสาธารณะ drawcircle () {system.out.println ("drawadapter4Object: drawcircle"); } โมฆะสาธารณะ DrawRectangle (String msg) {drawRectangle.drawRectangle (msg); - 3. อะแดปเตอร์อินเตอร์เฟส
แผนภาพชั้นเรียน
/ * * อะแดปเตอร์อินเทอร์เฟซ: มีวิธีนามธรรมในอินเทอร์เฟซ เราต้องการใช้เพียงไม่กี่อย่างเท่านั้น แต่เราไม่ต้องการนำไปใช้ทั้งหมด * ดังนั้นให้ใช้การใช้งานที่ว่างเปล่าเริ่มต้นจากนั้นสืบทอดมาจากมันและเขียนวิธีที่เราต้องการใช้ */ Idraw อินเตอร์เฟสสาธารณะ {void drawcircle (); โมฆะ DrawRectangle (); - /** การใช้งานเริ่มต้นของอะแดปเตอร์อินเทอร์เฟซ*/คลาสสาธารณะ DEFAINTDRAWADAPTER ใช้ IDRAW {// การใช้งานของสี่เหลี่ยมและวงกลม @Override โมฆะสาธารณะ drawCircle () {} @Override โมฆะสาธารณะ DrawRectangle () {}}}} การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// อะแดปเตอร์วัตถุ DrawAdapter4Object objadapter = ใหม่ drawadapter4Object (ใหม่ drawRectangle ()); objadapter.drawcircle (); objadapter.drawrectangle ("ใน drawadapter4object"); System.out.println ("-------------------"); // คลาสอะแดปเตอร์ drawAdapter4class clzadapter = ใหม่ drawadapter4class (); clzadapter.drawcircle (); clzadapter.drawrectangle ("ใน drawadapter4class"); System.out.println ("---------------------"); // อินเตอร์เฟสอะแดปเตอร์ myDrawadapter myDrawAdapter = ใหม่ myDrawadapter (); myDrawadapter.drawcircle (); MyDrawadapter.drawRectangle (); } คลาสคงที่ myDrawAdapter ขยาย defaultDrawAdapter {@Override โมฆะสาธารณะ drawCircle () {system.out.println ("drawcircle ใน myDrawadapter"); -พิมพ์
DrawAdapter4Object: Drawcircle Draw Rectangle: ใน DrawAdapter4Object -------------- DrawAdapter4Class: Drawcircle Draw Rectangle: ใน DrawAdapter4class -------------- Drawcircle ใน MyDrawadapter
สามคุณสมบัติของโหมดอะแดปเตอร์:
1 วัตถุอะแดปเตอร์ใช้อินเทอร์เฟซดั้งเดิม
2 วัตถุอะแดปเตอร์รวมวัตถุที่ใช้อินเทอร์เฟซใหม่ (วัตถุนี้ยังไม่สามารถใช้อินเทอร์เฟซมันเป็นเพียงวัตถุที่เรียบง่าย)
3. วิธีเฉพาะที่การเรียกใช้วิธีการอินเตอร์เฟสดั้งเดิมของอะแดปเตอร์ได้รับการมอบหมายให้เป็นอินสแตนซ์ของอินเทอร์เฟซใหม่
บางคนคิดว่าตัวอย่างที่อธิบายรูปแบบการออกแบบนั้นง่ายเกินไปและดูเหมือนว่าเป็นอย่างนั้น แต่ถ้าคุณต้องการใช้มันในการพัฒนาโครงการจริง ๆ มันจะไม่สามารถนำไปใช้ได้ ในความเป็นจริงเราไม่จำเป็นต้องใช้รูปแบบการออกแบบในโครงการของเราโดยเจตนา แต่ควรเริ่มต้นจากปัญหาการออกแบบจริงและใช้รูปแบบที่สามารถแก้ปัญหาของเราได้ อย่าใช้รูปแบบเพื่อประโยชน์ในการใช้รูปแบบจากนั้นเพียงแค่ข้ามบรรทัดล่าง โดยทั่วไปแล้วตราบใดที่คุณปฏิบัติตามหลักการออกแบบบางอย่างรูปแบบการออกแบบก็สรุปตามหลักการเหล่านี้ หากคุณคุ้นเคยกับหลักการเหล่านี้รูปแบบจะมีอยู่ตามธรรมชาติ