รูปแบบ Command: การห่อหุ้มการกระทำ
ห่อคำขอเป็นออบเจ็กต์ Command เพื่อรองรับการเลิกทำ/ทำซ้ำและการบันทึกมาโคร
รูปแบบ Command: การห่อหุ้มการกระทำ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
เจตนาของ Command
Command ห่อหุ้มคำขอไว้ในรูปออบเจ็กต์ ทำให้สามารถกำหนดพารามิเตอร์ให้ไคลเอ็นต์ด้วยคำขอที่แตกต่างกัน จัดคิว บันทึกข้อมูล และรองรับการดำเนินการที่เลิกทำได้
อินเทอร์เฟซของ Command
กำหนดอินเทอร์เฟซที่มีเมธอด execute() และอาจมีเมธอด undo() ด้วย ออบเจ็กต์ Command แต่ละตัวรู้วิธีดำเนินการและย้อนกลับการกระทำหนึ่งอย่าง
public interface Command {
void execute();
void undo();
}Command รูปธรรม: TextEditor
Command รูปธรรมแต่ละตัวห่อหุ้มตัวรับคำขอและพารามิเตอร์ของการกระทำไว้ การดำเนินการจะทำให้การกระทำนั้นเกิดขึ้น ส่วนการเลิกทำจะย้อนกลับการกระทำนั้น
public class InsertTextCommand implements Command {
private final TextEditor editor;
private final String text;
private final int position;
public InsertTextCommand(TextEditor editor, String text, int pos) {
this.editor = editor; this.text = text; this.position = pos;
}
public void execute() { editor.insert(position, text); }
public void undo() { editor.delete(position, text.length()); }
}ผู้เรียกใช้: CommandHistory
ผู้เรียกใช้เก็บประวัติของ Command ที่ดำเนินการแล้ว โดยเรียก execute() และนำ Command ไปใส่ในสแตก การเลิกทำจะนำออกจากสแตกแล้วเรียก undo()
public class CommandHistory {
private final Deque<Command> history = new ArrayDeque<>();
public void execute(Command cmd) {
cmd.execute();
history.push(cmd);
}
public void undo() {
if (!history.isEmpty()) history.pop().undo();
}
}สแตกเลิกทำ / ทำซ้ำ
เพิ่มสแตกทำซ้ำ: ขณะเลิกทำ ให้นำ Command ไปใส่ในสแตกทำซ้ำ ขณะทำซ้ำ ให้นำออกจากสแตกทำซ้ำแล้วดำเนินการอีกครั้ง
private final Deque<Command> undoStack = new ArrayDeque<>();
private final Deque<Command> redoStack = new ArrayDeque<>();
public void redo() {
if (!redoStack.isEmpty()) {
Command cmd = redoStack.pop();
cmd.execute();
undoStack.push(cmd);
}
}Command แบบแมโคร
Command แบบแมโครคือองค์ประกอบที่เก็บรายการ Command และดำเนินการตามลำดับ การเลิกทำจะดำเนินการย้อนกลับตามลำดับย้อนกลับ
public class MacroCommand implements Command {
private final List<Command> commands;
public MacroCommand(List<Command> commands) { this.commands = commands; }
public void execute() { commands.forEach(Command::execute); }
public void undo() { for (int i = commands.size()-1; i>=0; i--) commands.get(i).undo(); }
}คิว Command สำหรับประมวลผลงาน
เก็บ Command ไว้ในคิวและประมวลผลแบบอะซิงโครนัส เธรดผู้ปฏิบัติงานนำ Command ออกจากคิวแล้วดำเนินการ แยกผู้ผลิตออกจากเธรดที่ดำเนินการ
BlockingQueue<Command> queue = new LinkedBlockingQueue<>();
// Producer:
queue.put(new SendEmailCommand(recipient, subject, body));
// Consumer thread:
Command cmd = queue.take();
cmd.execute();Command พร้อมตัวดำเนินการ
ห่อ Command เป็นแลมบ์ดา Runnable แล้วส่งให้ ExecutorService โดยแลมบ์ดาจะทำหน้าที่เป็นออบเจ็กต์ Command
ExecutorService exec = Executors.newFixedThreadPool(4);
exec.submit(() -> sendEmail(recipient, subject));
exec.submit(() -> generateReport(params));การบันทึก Command เพื่อการตรวจสอบย้อนหลัง
ออบเจ็กต์ Command ที่สามารถทำให้เป็นข้อมูลอนุกรมได้สามารถจัดเก็บถาวรลงในบันทึกได้ เมื่อกู้คืน ให้เล่นซ้ำเพื่อสร้างสถานะสุดท้ายกลับมา ซึ่งเป็นพื้นฐานของแนวทางสร้างสถานะจากเหตุการณ์
void execute(Command cmd) {
cmd.execute();
auditLog.append(cmd.toString()); // log every action
history.push(cmd);
}ปุ่มการกระทำใน GUI
ในเฟรมเวิร์ก GUI ปุ่มหรือรายการเมนูแต่ละรายการจะเก็บ Command ไว้ การคลิกปุ่มจะเรียก command.execute() สลับ Command ขณะทำงานเพื่อเปลี่ยนพฤติกรรมของปุ่ม
Button saveBtn = new Button("Save");
saveBtn.setOnAction(() -> new SaveDocumentCommand(doc).execute());Command กับกลยุทธ์
ทั้งคู่ห่อหุ้มพฤติกรรม กลยุทธ์ห่อหุ้มอัลกอริทึมที่สามารถสลับได้ขณะทำงาน ส่วน Command ห่อหุ้มคำขอที่สมบูรณ์ ซึ่งรวมพารามิเตอร์และตัวรับคำขอ พร้อมรองรับประวัติและการจัดคิว
Command ใน Spring
Tasklet ของ Spring Batch และ MessageHandler ของ Spring Integration เป็นรูปแบบ Command ระดับแอปพลิเคชัน โดย Tasklet แต่ละตัวห่อหุ้มขั้นตอนหนึ่งของงานแบบกลุ่ม
ตรวจสอบอย่างรวดเร็ว
Command เพิ่มเมธอดใดนอกเหนือจาก execute() เพื่อรองรับการเลิกทำ
ทบทวน
Command ห่อหุ้มการกระทำไว้ในรูปออบเจ็กต์ ใช้สำหรับสแตกเลิกทำ/ทำซ้ำ คิวงาน การบันทึกแมโคร และการบันทึกข้อมูลเพื่อการตรวจสอบย้อนหลัง ผสานกับผู้เรียกใช้ที่ดูแลประวัติของ Command
คำถามที่พบบ่อย
บทเรียน “รูปแบบ Command: การห่อหุ้มการกระทำ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รูปแบบ Command: การห่อหุ้มการกระทำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบ Command: การห่อหุ้มการกระทำ”
ห่อคำขอเป็นออบเจ็กต์ Command เพื่อรองรับการเลิกทำ/ทำซ้ำและการบันทึกมาโคร คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “รูปแบบ Command: การห่อหุ้มการกระทำ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบ Observer: การแจ้งเตือนเหตุการณ์
- รูปแบบ Strategy: อัลกอริทึมที่สลับใช้ได้
- รูปแบบ Command: การห่อหุ้มการกระทำ
- Template Method: การกำหนดโครงร่างอัลกอริทึม