Java Academy · درس

نمط Command: تغليف الإجراءات

غلّف الطلبات في كائنات Command لدعم التراجع والإعادة وتسجيل وحدات الماكرو

الدرس 3 من 414 خطوة

نمط Command: تغليف الإجراءات درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

الغرض من الأمر

يغلف نمط الأمر طلبًا في كائن، مما يتيح تزويد العملاء بمعلمات مختلفة، ووضع الطلبات في قوائم انتظار، وتسجيلها، وتنفيذ عمليات يمكن التراجع عنها.

واجهة الأمر

عرّفوا واجهة تحتوي على طريقة execute()، واختياريًا طريقة undo(). يعرف كل كائن أمر كيفية تنفيذ إجراء واحد وعكسه.

public interface Command {
    void execute();
    void undo();
}

الأمر الملموس: TextEditor

يغلف كل أمر ملموس مستقبِلًا ومعلمات الإجراء. ينفّذ الأمر الإجراء، بينما يعكسه التراجع.

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

يحتفظ المستدعي بسجل للأوامر المنفّذة. يستدعي execute() ويدفع الأمر إلى مكدس. يزيل التراجع أمرًا من المكدس ويستدعي 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();
    }
}

مكدس التراجع والإعادة

أضيفوا مكدسًا للإعادة: عند التراجع، ادفعوا الأمر إلى مكدس الإعادة؛ وعند الإعادة، أزيلوا الأمر من مكدس الإعادة وأعيدوا تنفيذه.

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);
    }
}

الأمر الماكرو

الأمر الماكرو كائن مركب يحتوي على قائمة من الأوامر وينفّذها بالتتابع. ينفّذ التراجع عمليات العكس بترتيب عكسي.

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(); }
}

قائمة انتظار الأوامر لمعالجة المهام

خزّنوا الأوامر في قائمة انتظار وعالجوها بشكل غير متزامن. يزيل خيط عامل الأوامر من قائمة الانتظار وينفّذها، مما يفصل المنتجين عن خيط التنفيذ.

BlockingQueue<Command> queue = new LinkedBlockingQueue<>();
// Producer:
queue.put(new SendEmailCommand(recipient, subject, body));
// Consumer thread:
Command cmd = queue.take();
cmd.execute();

الأمر مع Executor

غلّفوا الأوامر في lambdas من النوع Runnable وأرسلوها إلى ExecutorService؛ إذ تمثل lambda كائن الأمر.

ExecutorService exec = Executors.newFixedThreadPool(4);
exec.submit(() -> sendEmail(recipient, subject));
exec.submit(() -> generateReport(params));

تسجيل الأوامر لأغراض التدقيق

يمكن حفظ كائنات الأمر القابلة للتسلسل في سجل. وعند الاسترداد، أعيدوا تشغيلها لإعادة بناء الحالة النهائية، وهذا هو الأساس الذي يقوم عليه Event Sourcing.

void execute(Command cmd) {
    cmd.execute();
    auditLog.append(cmd.toString()); // log every action
    history.push(cmd);
}

أزرار الإجراءات في GUI

في أطر عمل GUI، يحتفظ كل زر أو عنصر قائمة بأمر. يؤدي النقر على الزر إلى استدعاء command.execute(). بدّلوا الأوامر أثناء التشغيل لتغيير سلوك الزر.

Button saveBtn = new Button("Save");
saveBtn.setOnAction(() -> new SaveDocumentCommand(doc).execute());

الأمر مقابل الاستراتيجية

كلاهما يغلف السلوك. تغلف الاستراتيجية خوارزمية يمكن تبديلها أثناء التشغيل. أما الأمر فيغلف طلبًا كاملًا، بما في ذلك معلماته والمستقبِل، ويدعم السجل وقوائم الانتظار.

الأمر في Spring

يُعدّ Tasklet في Spring Batch وMessageHandler في Spring Integration تطبيقين على نمط الأمر على مستوى التطبيق. يغلف كل Tasklet خطوة واحدة من مهمة دفعية.

تحقق سريع

ما الطريقة الإضافية التي يضيفها Command إلى جانب execute() لدعم التراجع؟

مراجعة

يغلف الأمر الإجراءات في كائنات. استخدموه لمكدسات التراجع والإعادة، وقوائم انتظار المهام، وتسجيل وحدات الماكرو، وتسجيل التدقيق. ادمجوه مع مستدعٍ يحتفظ بسجل الأوامر.

البدء مجانًا

تعلم Java مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
104
الدروس
374

الأسئلة الشائعة

هل درس «نمط Command: تغليف الإجراءات» مجاني؟

نعم — نص درس «نمط Command: تغليف الإجراءات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «نمط Command: تغليف الإجراءات»؟

غلّف الطلبات في كائنات Command لدعم التراجع والإعادة وتسجيل وحدات الماكرو تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «نمط Command: تغليف الإجراءات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نمط Observer: إشعارات الأحداث
  2. نمط Strategy: خوارزميات قابلة للتبديل
  3. نمط Command: تغليف الإجراءات
  4. نمط Template Method: تعريف هياكل الخوارزميات
← العودة إلى Java Academy