คำนิยาม:
โมดูลระดับสูงไม่ควรพึ่งพาโมดูลระดับต่ำทั้งคู่ควรพึ่งพาสิ่งที่เป็นนามธรรม abstractions ไม่ควรพึ่งพารายละเอียด; รายละเอียดควรพึ่งพาสิ่งที่เป็นนามธรรม
ต้นกำเนิดของปัญหา: คลาส A โดยตรงขึ้นอยู่กับคลาส B หากคุณต้องการเปลี่ยนคลาส A เพื่อขึ้นอยู่กับคลาส C คุณต้องบรรลุเป้าหมายโดยการปรับเปลี่ยนรหัสของคลาส A ในสถานการณ์นี้คลาส A โดยทั่วไปเป็นโมดูลระดับสูงที่รับผิดชอบตรรกะทางธุรกิจที่ซับซ้อน คลาส B และคลาส C เป็นโมดูลระดับต่ำที่รับผิดชอบการทำงานของอะตอมขั้นพื้นฐาน หากมีการแก้ไขคลาส A มันจะนำความเสี่ยงที่ไม่จำเป็นมาสู่โปรแกรม
วิธีแก้ปัญหา: แก้ไขคลาส A เพื่อขึ้นอยู่กับอินเตอร์เฟส I และคลาส B และคลาส C แต่ละอินเตอร์เฟสการใช้งาน I. คลาส A ติดต่อคลาส B หรือคลาส C ผ่านอินเตอร์เฟส I ซึ่งจะลดโอกาสในการแก้ไขคลาส A. ได้อย่างมาก
หลักการของการผกผันขึ้นอยู่กับความจริงที่ว่าสิ่งที่เป็นนามธรรมมีความเสถียรมากกว่าความแปรปรวนในรายละเอียด สถาปัตยกรรมที่สร้างขึ้นบนนามธรรมมีความเสถียรมากกว่าสถาปัตยกรรมที่สร้างขึ้นจากรายละเอียด ใน Java บทคัดย่อหมายถึงอินเทอร์เฟซหรือคลาสนามธรรมและรายละเอียดเป็นคลาสการใช้งานเฉพาะ วัตถุประสงค์ของการใช้อินเทอร์เฟซหรือคลาสนามธรรมคือการกำหนดข้อกำหนดและสัญญาโดยไม่เกี่ยวข้องกับการดำเนินการเฉพาะใด ๆ และส่งมอบงานนำเสนอรายละเอียดไปยังคลาสการใช้งานของพวกเขาเพื่อให้เสร็จสิ้น
แนวคิดหลักของหลักการของการผกผันการพึ่งพาคือการเขียนโปรแกรมเชิงอินเตอร์เฟส เราจะยังคงใช้ตัวอย่างเพื่อแสดงให้เห็นว่าการเขียนโปรแกรมที่เน้นอินเทอร์เฟซดีกว่าการเขียนโปรแกรมเชิงการนำไปใช้ ฉากนั้นเป็นเช่นนี้: แม่เล่าเรื่องให้ลูกของเธอ ตราบใดที่เธอให้หนังสือเธอเธอสามารถเล่าเรื่องราวให้ลูกของเธอตามหนังสือเล่มนี้
ตัวอย่าง:
การผกผันของการพึ่งพาผิดกฎหมาย
นักเรียนชั้นเรียนสาธารณะ {โมฆะสาธารณะอ่าน (หนังสือเล่ม) {System.out.println ("นักเรียนเริ่มอ่าน:"+book.getName ()); }} หนังสือเรียนสาธารณะ {สตริงสาธารณะ getName () {return "book"; -
เมื่อนักเรียนจำเป็นต้องอ่านหน้าเว็บพวกเขาจำเป็นต้องปรับเปลี่ยนชั้นเรียนของนักเรียนซึ่งเป็นการออกแบบที่ไม่เป็นมิตรมาก ลองดูตัวอย่างของการยึดมั่นในหลักการของการผกผันของการพึ่งพา
บุคคลอินเทอร์เฟซสาธารณะ {โมฆะสาธารณะอ่าน (เครื่องอ่านผู้อ่าน); } ตัวอ่านอินเตอร์เฟสสาธารณะ {สตริงสาธารณะ getName (); } นักเรียนชั้นเรียนสาธารณะใช้บุคคล {@Override โมฆะสาธารณะอ่าน (Reader Reader) {System.out.println ("นักเรียนเริ่มอ่าน:"+reader.getName ()); }} หนังสือคลาสสาธารณะใช้เครื่องอ่าน {สตริงสาธารณะ getName () {return "book"; }} เว็บไซต์คลาสสาธารณะใช้เครื่องอ่าน {สตริงสาธารณะ getName () {return "หน้าเว็บ"; }} การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {person student = student (ใหม่ (); นักเรียนอ่าน (หนังสือเล่มใหม่ ()); นักเรียนอ่าน (เว็บไซต์ใหม่ ()); -
ในวิธีการอ่านเราใช้อินเตอร์เฟสเป็นพารามิเตอร์
สรุป:
1. เป็นการดีที่สุดที่จะมีอินเทอร์เฟซหรือคลาสนามธรรมสำหรับแต่ละคลาสหรือทั้งอินเตอร์เฟสและคลาสนามธรรม
2. การประกาศตัวแปรนั้นควรเป็นอินเทอร์เฟซหรือคลาสนามธรรม
3. ปฏิบัติตามหลักการของการทดแทนในระหว่างการสืบทอด