23 รูปแบบการออกแบบบทที่ 12: โหมดวิธีเทมเพลต Java
คำจำกัดความ: กำหนดกรอบของอัลกอริทึมในการดำเนินการและล่าช้าขั้นตอนบางอย่างไปยังคลาสย่อยเพื่อให้คลาสย่อยสามารถกำหนดขั้นตอนเฉพาะบางอย่างในอัลกอริทึมโดยไม่ต้องเปลี่ยนโครงสร้างของอัลกอริทึม
ประเภท: รูปแบบพฤติกรรม
แผนภาพชั้นเรียน:
ในความเป็นจริงวิธีเทมเพลตเป็นรูปแบบที่ใช้บ่อยในการเขียนโปรแกรม ก่อนอื่นให้ดูตัวอย่าง อยู่มาวันหนึ่งโปรแกรมเมอร์ 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
มันทำงานตามปกติ ตกลงงานจะเสร็จสมบูรณ์ ถูกต้องนี่คือรูปแบบวิธีการเทมเพลต ผู้สำเร็จการศึกษาส่วนใหญ่ที่เพิ่งเข้ามาในที่ทำงานควรมีประสบการณ์คล้ายกับ B. งานที่ซับซ้อนถูกเขียนขึ้นโดยคนที่ยิ่งใหญ่ใน บริษัท แล้วเขียนวิธีที่ง่ายขึ้นลงในนามธรรมและส่งมอบให้กับเพื่อนร่วมงานคนอื่น ๆ เพื่อพัฒนา แผนกแรงงานนี้มักใช้ใน บริษัท ที่มีระดับโปรแกรมเมอร์ค่อนข้างชัดเจน ตัวอย่างเช่นหากทีมงานโครงการมีสถาปนิกวิศวกรอาวุโสและวิศวกรรุ่นเยาว์สถาปนิกมักใช้อินเทอร์เฟซจำนวนมากและคลาสนามธรรมเพื่อรวมตรรกะของระบบทั้งหมดเข้าด้วยกัน แล้วคุณใช้โหมดวิธีการเทมเพลตหรือไม่?
โครงสร้างของรูปแบบวิธีการเทมเพลต
รูปแบบวิธีการเทมเพลตประกอบด้วยคลาสนามธรรมและคลาสการใช้งาน (หรือกลุ่ม) ผ่านโครงสร้างการสืบทอด วิธีการในคลาสนามธรรมแบ่งออกเป็นสามประเภท:
วิธีการนามธรรม: คลาสหลักเท่านั้นที่ประกาศ แต่ไม่ได้ใช้งาน แต่กำหนดข้อกำหนดและจากนั้นใช้พวกเขาโดยคลาสย่อยของมัน
วิธีการเทมเพลต: ประกาศและดำเนินการโดยคลาสนามธรรม โดยทั่วไปวิธีการแม่แบบเรียกใช้วิธีการนามธรรมเพื่อให้ฟังก์ชั่นเชิงตรรกะหลักและวิธีการเทมเพลตส่วนใหญ่จะถูกกำหนดเป็นประเภทสุดท้ายซึ่งบ่งชี้ว่าฟังก์ชั่นตรรกะหลักไม่สามารถเขียนใหม่ในคลาสย่อย
วิธีการขอ: ประกาศและดำเนินการโดยคลาสนามธรรม อย่างไรก็ตามคลาสย่อยสามารถขยายได้และคลาสย่อยอาจส่งผลกระทบต่อตรรกะของวิธีการเทมเพลตโดยการขยายวิธีการตะขอ
ภารกิจของคลาสนามธรรมคือการสร้างกรอบตรรกะซึ่งมักจะเขียนโดยบุคลากรที่มีประสบการณ์เนื่องจากคุณภาพของคลาสนามธรรมโดยตรงจะกำหนดว่าโปรแกรมมีความเสถียรหรือไม่
คลาสการใช้งานใช้เพื่อใช้รายละเอียด วิธีการเทมเพลตในคลาสนามธรรมทำให้ตรรกะทางธุรกิจเสร็จสมบูรณ์โดยใช้วิธีการขยายคลาส ตราบใดที่วิธีการขยายในคลาสการใช้งานผ่านการทดสอบหน่วยการทำงานโดยทั่วไปฟังก์ชั่นโดยทั่วไปจะไม่มีข้อผิดพลาดที่สำคัญภายใต้หลักฐานที่ว่าวิธีเทมเพลตนั้นถูกต้อง
ข้อดีและสถานการณ์ที่เกี่ยวข้องของวิธีการเทมเพลต
ขยายง่าย โดยทั่วไปวิธีการเทมเพลตในคลาสนามธรรมเป็นส่วนหนึ่งที่ไม่ง่ายต่อการเปลี่ยนแปลงย้อนกลับในขณะที่วิธีนามธรรมเป็นส่วนที่ง่ายต่อการเปลี่ยนแปลงย้อนกลับ ดังนั้นโดยการเพิ่มคลาสการใช้งานจึงเป็นเรื่องง่ายที่จะขยายฟังก์ชั่นซึ่งสอดคล้องกับหลักการของการเปิดและปิด
ง่ายต่อการบำรุงรักษา สำหรับโหมดวิธีการเทมเพลตมันเป็นเพราะตรรกะหลักของพวกเขาเหมือนกันกับวิธีการใช้เทมเพลต หากไม่ได้ใช้วิธีเทมเพลตมันก็ไม่สะดวกมากที่จะรักษารหัสเดียวกันไว้ในความยุ่งเหยิง
ยืดหยุ่นมากขึ้น เนื่องจากมีวิธีการขอการใช้งานของคลาสย่อยอาจส่งผลกระทบต่อการทำงานของตรรกะหลักในคลาสหลัก อย่างไรก็ตามในขณะที่มีความยืดหยุ่นเนื่องจากคลาสย่อยส่งผลกระทบต่อชั้นพาเรนต์การละเมิดหลักการทดแทนของริกเตอร์จะนำความเสี่ยงมาสู่โปรแกรม สิ่งนี้ทำให้ข้อกำหนดที่สูงขึ้นในการออกแบบคลาสนามธรรม
เมื่อคลาสย่อยหลายรายการมีวิธีการเดียวกันและวิธีการเหมือนกันอย่างมีเหตุผลคุณสามารถพิจารณาใช้รูปแบบวิธีการเทมเพลต โหมดนี้ยังเหมาะสำหรับการใช้โปรแกรมเมื่อกรอบหลักของโปรแกรมเหมือนกันและรายละเอียดแตกต่างกัน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น