คำนิยาม:
เฟรมเวิร์กสำหรับการกำหนดอัลกอริทึมในการดำเนินการชะลอขั้นตอนบางขั้นตอนไปยังคลาสย่อย สิ่งนี้ช่วยให้คลาสย่อยสามารถกำหนดขั้นตอนเฉพาะบางอย่างของอัลกอริทึมโดยไม่ต้องเปลี่ยนโครงสร้างของอัลกอริทึม
ฟังดูสูงมากความเข้าใจของฉัน:
1. คลาสหลักประกาศวิธีการนามธรรมหลายวิธี (วิธีพื้นฐาน) และวิธีการเฉพาะหลายวิธี (วิธีการเทมเพลต)
2. วิธีนามธรรมเป็นขั้นตอนของอัลกอริทึม (กระบวนการ) ที่นำไปใช้ในคลาสย่อย
3. วิธีเทมเพลตเป็นกรอบอัลกอริทึม (กระบวนการ) มันได้รับการตกลงกันในคลาสหลักเพื่อใช้การโทรไปยังวิธีการพื้นฐานและทำตรรกะคงที่เสร็จสมบูรณ์
4. โครงสร้างของอัลกอริทึม (กระบวนการ) ถูกกำหนดไว้ในคลาสหลักและรายละเอียดการใช้งานเฉพาะจะถูกนำไปใช้ในคลาสย่อย
หมายเหตุ: เพื่อป้องกันการดำเนินการที่เป็นอันตรายจะมีการเพิ่มวิธีเทมเพลตทั่วไปด้วยขั้นสุดท้ายและห้ามเขียนใหม่
แผนภาพชั้นเรียนทั่วไป:
ในความเป็นจริงวิธีเทมเพลตเป็นรูปแบบที่ใช้บ่อยในการเขียนโปรแกรม ก่อนอื่นให้ดูตัวอย่าง อยู่มาวันหนึ่งโปรแกรมเมอร์ A ได้งาน: ให้อาร์เรย์ของจำนวนเต็มเรียงลำดับตัวเลขในอาร์เรย์จากขนาดเล็กไปใหญ่แล้วพิมพ์ผลลัพธ์ที่เรียงลำดับ หลังจากการวิเคราะห์งานนี้สามารถแบ่งออกเป็นสองส่วน: การเรียงลำดับและการพิมพ์ ฟังก์ชั่นการพิมพ์ใช้งานง่ายดังนั้นการเรียงลำดับจึงค่อนข้างลำบาก แต่มีวิธีก่อนที่จะทำฟังก์ชั่นการพิมพ์ก่อนและหาคนอื่นให้ทำฟังก์ชั่นการเรียงลำดับ
บทคัดย่อคลาส AbstractSort { / *** เรียงลำดับอาร์เรย์จากขนาดเล็กถึงขนาดเล็ก* @param array* / การจัดเรียงนามธรรมบทคัดย่อ (int [] array); โมฆะสาธารณะ sweetortresult (int [] อาร์เรย์) {this.sort (อาร์เรย์); System.out.print ("เรียงลำดับผล:"); สำหรับ (int i = 0; i <array.length; i ++) {system.out.printf ("%3S", อาร์เรย์ [i]); -หลังจากเขียนเพื่อนร่วมงานที่เพิ่งจบการศึกษาและเริ่มทำงานและพูดว่า: มีงานฉันได้เขียนตรรกะหลักเพื่อให้คุณสามารถใช้ตรรกะที่เหลืออยู่ได้ ดังนั้นฉันจึงให้คลาส Abstractsort กับ B และให้ B เขียนเพื่อนำไปใช้ B เอามันไปและเห็นมัน มันง่ายเกินไป มันทำใน 10 นาที รหัสมีดังนี้:
concretesort คลาสขยาย AbstractSort {@Override Void Protected Void Sort (int [] array) {สำหรับ (int i = 0; i <array.length-1; i ++) {selectSort (array, i); }} โมฆะส่วนตัวเลือก (int [] อาร์เรย์, ดัชนี int) {int minvalue = 32767; // ค่า min ค่าตัวแปร int indexmin = 0; // ดัชนีค่าต่ำสุดดัชนีตัวแปร int temp; // การจัดเตรียมตัวแปรสำหรับ (int i = index; i <array.length; i ++) {ถ้า (อาร์เรย์ [i] <minvalue) {// ค้นหาค่าต่ำสุด minvalue = array [i]; // ที่เก็บข้อมูลค่าต่ำสุด indexmin = i; }} temp = array [index]; // สลับอาร์เรย์ตัวเลขสองค่า [ดัชนี] = อาร์เรย์ [indexmin]; อาร์เรย์ [indexmin] = อุณหภูมิ; -หลังจากเขียนมันให้มันและจะนำมันไปใช้:
ไคลเอนต์ระดับสาธารณะ {สาธารณะคงที่ int [] a = {10, 32, 1, 9, 5, 7, 12, 0, 4, 3}; // ข้อมูลที่ตั้งไว้ล่วงหน้าอาร์เรย์โมฆะคงที่สาธารณะหลัก (สตริง [] args) {AbstractSort S = New Concretesort (); S.ShowsOrtresult (A); - ผลการทำงาน:
เรียงลำดับผลลัพธ์: 0 1 3 4 5 7 9 10 12 32
โครงสร้างของรูปแบบวิธีการเทมเพลต
รูปแบบวิธีการเทมเพลตประกอบด้วยคลาสนามธรรมและคลาสการใช้งาน (หรือกลุ่ม) ผ่านโครงสร้างการสืบทอด วิธีการในคลาสนามธรรมแบ่งออกเป็นสามประเภท:
วิธีการนามธรรม: คลาสหลักเท่านั้นที่ประกาศ แต่ไม่ได้ใช้งาน แต่กำหนดข้อกำหนดและจากนั้นใช้พวกเขาโดยคลาสย่อยของมัน
วิธีการเทมเพลต: ประกาศและดำเนินการโดยคลาสนามธรรม โดยทั่วไปวิธีการแม่แบบเรียกใช้วิธีการนามธรรมเพื่อให้ฟังก์ชั่นเชิงตรรกะหลักและวิธีการเทมเพลตส่วนใหญ่จะถูกกำหนดเป็นประเภทสุดท้ายซึ่งบ่งชี้ว่าฟังก์ชั่นตรรกะหลักไม่สามารถเขียนใหม่ในคลาสย่อย
วิธีการขอ: ประกาศและดำเนินการโดยคลาสนามธรรม อย่างไรก็ตามคลาสย่อยสามารถขยายได้และคลาสย่อยอาจส่งผลกระทบต่อตรรกะของวิธีการเทมเพลตโดยการขยายวิธีการตะขอ
ภารกิจของคลาสนามธรรมคือการสร้างกรอบตรรกะซึ่งมักจะเขียนโดยบุคลากรที่มีประสบการณ์เนื่องจากคุณภาพของคลาสนามธรรมโดยตรงจะกำหนดว่าโปรแกรมมีความเสถียรหรือไม่
คลาสการใช้งานใช้เพื่อใช้รายละเอียด วิธีการเทมเพลตในคลาสนามธรรมทำให้ตรรกะทางธุรกิจเสร็จสมบูรณ์โดยใช้วิธีการขยายคลาส ตราบใดที่วิธีการขยายในคลาสการใช้งานผ่านการทดสอบหน่วยการทำงานโดยทั่วไปฟังก์ชั่นโดยทั่วไปจะไม่มีข้อผิดพลาดที่สำคัญภายใต้หลักฐานที่ว่าวิธีเทมเพลตนั้นถูกต้อง
ข้อดีของโหมดวิธีการเทมเพลต:
1. ห่อหุ้มส่วนที่ไม่เปลี่ยนแปลงและขยายส่วนตัวแปร
2. แยกส่วนสาธารณะของรหัสเพื่อการบำรุงรักษาที่ง่าย
3. พฤติกรรมถูกควบคุมโดยคลาสหลักและดำเนินการโดยชั้นเด็ก
สถานการณ์ที่ใช้งานได้สำหรับโหมดวิธีการแม่แบบ:
1. หลายคลาสย่อยมีวิธีการสาธารณะและตรรกะนั้นเหมือนกัน
2. สำหรับอัลกอริทึมที่ซับซ้อนอัลกอริทึมหลักได้รับการออกแบบเป็นวิธีการเทมเพลตและฟังก์ชั่นโดยละเอียดจะถูกนำไปใช้โดยแต่ละคลาสย่อย
3. refactoring รหัส
การขยายรูปแบบวิธีการเทมเพลต
สรุป:
คลาสหลักกำหนดกรอบการทำงาน หลังจากชั้นเรียนเด็กเขียนวิธีการบางอย่างของคลาสแม่แล้วมันเรียกวิธีที่สืบทอดมาจากคลาสหลักเพื่อสร้างผลลัพธ์ที่แตกต่างกัน