รูปแบบการออกแบบเมธอดเทมเพลตช่วยให้คุณกำหนดขั้นตอนของอัลกอริทึมภายในเมธอดเดียวของคลาสได้ สิ่งนี้ทำให้คุณสามารถจำกัดการดำเนินการเฉพาะของแอปพลิเคชันให้เป็นวิธีการเดียว
แต่ละขั้นตอนของอัลกอริทึมที่เมธอดเทมเพลตกำหนดคือเมธอดภายใน อย่างไรก็ตาม วิธีเทมเพลตจะจัดการเฉพาะการนำวิธีการภายในบางส่วนไปใช้เท่านั้น คลาสย่อยมักจะใช้เมธอดภายในของเมธอดเท็มเพลตอย่างน้อยหนึ่งวิธี
คลิปวิดีโอประจำวันนี้
คลาสย่อยสามารถใช้เมธอดนามธรรมได้ แต่ไม่สามารถกำหนดอัลกอริทึมใหม่ที่ใช้โดยเมธอดสุดท้ายได้
วิธีการทำงานของเทมเพลต
รูปแบบวิธีการเทมเพลตทั่วไปจะมีโครงสร้างดังต่อไปนี้:
final void templateMethod() {
abstractOperation1();
abstractOperation2();
concreteOperation1();
concreteOperation2();
hook();
}
สิ่งสำคัญอันดับแรกที่ควรทราบคือ templateMethod() ถือเป็นที่สิ้นสุด ดังนั้นจึงไม่มีคลาสย่อยใดสามารถแทนที่เมธอดนี้ได้ สิ่งสำคัญอีกประการที่ควรทราบคือเมธอดสามประเภทที่รูปแบบเมธอดเทมเพลตใช้: คอนกรีต นามธรรม และเบ็ด
คลาสนามธรรมที่มีเมธอดเทมเพลตใช้เมธอดที่เป็นรูปธรรมทั้งหมด ในขณะที่คลาสย่อยที่เป็นรูปธรรมใช้เมธอดนามธรรม โดยทั่วไปวิธีการของ hook จะไม่ทำอะไรเลยตามค่าเริ่มต้น แต่คลาสย่อยมีความสามารถในการแทนที่วิธีการเหล่านี้เมื่อจำเป็น
การใช้รูปแบบวิธีการเทมเพลตใน Java
รูปแบบเมธอดเทมเพลตทำหน้าที่เป็นเฟรมเวิร์กสำหรับแอปพลิเคชัน ดังนั้น คุณมักจะเห็นรูปแบบนี้ในเฟรมเวิร์กซอฟต์แวร์ที่ให้พิมพ์เขียวสำหรับการพัฒนาแอปพลิเคชัน
ฉันส่งไปที่ xbox one ได้ไหม
ตัวอย่างเช่น คุณสามารถเชื่อมต่อแอปพลิเคชันของคุณกับระบบฐานข้อมูลระบบใดระบบหนึ่งได้ ขั้นตอนในการเชื่อมต่อและใช้ฐานข้อมูลเป็นไปตามเทมเพลตที่คล้ายคลึงกัน:
public abstract class Database {
// template method
final void databaseTemplate() {
// abstract methods
setDBDriver();
setCredentials();
// concrete method
connect();
// abstract methods
createDB();
setData();
readData();
// hook methods
if (userWantsToUpdate()) {
updateData();
}
if (userWantsToDelete()) {
deleteData();
}
// concrete method
closeConnection();
}
abstract void setDBDriver();
abstract void setCredentials();
abstract void createDB();
abstract void setData();
abstract void readData();
abstract void updateData();
abstract void deleteData();
void connect() {
System.out.println("Connecting to database...");
}
void closeConnection() {
System.out.println("Destroying database connection...");
}
boolean userWantsToUpdate() {
return false;
}
boolean userWantsToDelete() {
return false;
}
}
คลาสฐานข้อมูลตัวอย่างนี้ใช้รูปแบบเมธอดเทมเพลตเพื่อสร้างเทมเพลตที่คุณสามารถใช้กับฐานข้อมูลใดก็ได้ ในการใช้ฐานข้อมูล แอปพลิเคชันของคุณจะต้องเชื่อมต่อกับฐานข้อมูล จากนั้นจึงทำลายการเชื่อมต่อหลังการใช้งาน กิจกรรมเหล่านี้มักจะเหมือนกันสำหรับฐานข้อมูลทั้งหมด ดังนั้นคลาสฐานข้อมูลนามธรรมสามารถใช้ เชื่อมต่อ() และ ปิดการเชื่อมต่อ() วิธีการ
วิธีอื่นๆ ในวิธีเทมเพลตจะแตกต่างกันไปตามประเภทของฐานข้อมูล ตัวอย่างเช่น ฐานข้อมูล MySQL เก็บข้อมูลในตาราง ในขณะที่ a ฐานข้อมูล MongoDB เก็บข้อมูลในคอลเล็กชัน . หากคุณต้องการใช้ a ฐานข้อมูล MySQL ใน Java เพียงสร้างคลาส MySQL ใหม่ที่ขยายคลาสฐานข้อมูล:
public class MySQL extends Database {
@Override
void setDBDriver() {
System.out.println("Selecting MySQL driver...");
}
@Override
void setCredentials() {
System.out.println("Setting MySQL database Credential...");
}
@Override
void createDB() {
System.out.println("Creating a new table...");
}
@Override
void setData() {
System.out.println("Inserting data into database...");
}
@Override
void readData() {
System.out.println("Retrieving data from database...");
}
@Override
void updateData() {
System.out.println("Updating data in database...");
}
@Override
void deleteData() {
System.out.println("Deleting data from database...");
}
}
คลาส MySQL ใช้เมธอดนามธรรมทั้งหมดของคลาสฐานข้อมูล นอกจากนี้ยังสามารถแทนที่วิธีการที่เป็นรูปธรรมบางอย่างได้ อย่างไรก็ตาม มันไม่สามารถสัมผัส ฐานข้อมูลTemplate() วิธีซึ่งใช้คำหลักสุดท้าย
public class Main {
public static void main(String[] args) {
Database mySQLDB = new MySQL();
mySQLDB.databaseTemplate();
}
}
คลาสหลักนี้สร้างอ็อบเจ็กต์ฐานข้อมูล MySQL ใหม่และใช้วิธีเทมเพลตเพื่อจำลองวิธีที่แอปพลิเคชันจะเชื่อมต่อกับฐานข้อมูล การรันเมธอดหลักจะพิมพ์เอาต์พุตต่อไปนี้ไปยังคอนโซล:
ในผลลัพธ์ คุณจะสังเกตเห็นว่าแอปพลิเคชันไม่เคยเรียก อัปเดตข้อมูล () และ ลบข้อมูล() วิธีการ นี่คือเหตุผลที่วิธีเบ็ดมีความสำคัญ ในฐานข้อมูล SQL คุณจะต้องสร้างตารางใหม่ แทรกข้อมูล และดูข้อมูลของคุณ อย่างไรก็ตาม คุณอาจไม่ต้องการอัปเดตหรือลบข้อมูล ดังนั้นเมธอดของ hook จึงให้ตัวเลือกคลาสย่อยในการควบคุมแง่มุมที่สำคัญเหล่านี้ของอัลกอริธึม
@Override
boolean userWantsToUpdate() {
return true;
}
เพียงเพิ่มโค้ดด้านบนลงในคลาส MySQL ตอนนี้แอปพลิเคชันจะอัปเดตข้อมูลในฐานข้อมูล หากคุณเรียกใช้คลาสหลักอีกครั้ง จะแสดงเอาต์พุตที่อัปเดตต่อไปนี้:
อย่างที่คุณเห็น แอปพลิเคชันกำลังอัปเดตข้อมูลในฐานข้อมูล
ประโยชน์ของการใช้รูปแบบการออกแบบวิธีเทมเพลต
ประโยชน์หลักของรูปแบบวิธีการเทมเพลตคือส่งเสริมการนำซอฟต์แวร์กลับมาใช้ใหม่ได้ รูปแบบการออกแบบนี้ยังสนับสนุนการเขียนโปรแกรมที่มีประสิทธิภาพ คลาสย่อยต้องการใช้เมธอดที่มีลักษณะเฉพาะสำหรับการดำเนินการเท่านั้น
นอกจากนี้ แอปพลิเคชันที่ใช้รูปแบบเมธอดเท็มเพลตมีความปลอดภัยมากขึ้น เนื่องจากคลาสภายนอกไม่สามารถเปลี่ยนแปลงโครงสร้างการดำเนินการได้