تخطَّ إلى المحتوى

🧩 شرح أنماط التصميم (Design Patterns)

نمط Template Method

الدرس 10 من 24· ⏱ 2 دقائق قراءة

مقدمة

يعرف Template Method هيكل الخوارزمية في كلاس أب، ويترك بعض الخطوات للفئات الفرعية لتنفيذها. يسمح بإعادة استخدام الكود مع السماح بالتخصيص.

الفكرة الأساسية

  • Template Method: دالة في الكلاس الأب تحدد تسلسل الخطوات.
  • الخطوات المجردة: دوال يجب على الفئات الفرعية تنفيذها.
  • الخطوات الاختيارية (Hooks): دوال لها تنفيذ افتراضي ويمكن تخطيها.
class DataProcessor {
  // Template Method
  process() {
    this.loadData();
    this.parseData();
    this.saveData();
    this.afterSave(); // Hook
  }

  loadData() {
    throw new Error("يجب تنفيذ loadData");
  }

  parseData() {
    throw new Error("يجب تنفيذ parseData");
  }

  saveData() {
    console.log("حفظ البيانات بشكل افتراضي");
  }

  afterSave() {} // Hook - اختياري
}

class CSVProcessor extends DataProcessor {
  loadData() {
    console.log("تحميل ملف CSV");
  }

  parseData() {
    console.log("تحليل CSV إلى مصفوفة");
  }
}

class JSONProcessor extends DataProcessor {
  loadData() {
    console.log("تحميل ملف JSON");
  }

  parseData() {
    console.log("تحليل JSON إلى كائن");

  afterSave() {
    console.log("إرسال إشعار بعد الحفظ");
  }
}

new CSVProcessor().process();
new JSONProcessor().process();

متى تستخدم Template Method؟

  • عندما يكون لديك عدة كلاسات تشارك نفس الخوارزمية لكن تختلف في التفاصيل.
  • عندما تريد منع الفئات الفرعية من تغيير هيكل الخوارزمية.
  • عندما تريد استخراج كود مشترك إلى كلاس أب.

⚠️ احذر من انتهاك مبدأ Liskov Substitution — تأكد أن الفئات الفرعية لا تغير سلوك الـ Template Method بشكل غير متوقع.

مثال Hook في أطر العمل

أطر العمل مثل React تستخدم Hooks بنفس الفكرة:

class Component {
  render() {
    this.componentWillMount(); // Hook
    return this.buildUI();
    this.componentDidMount(); // Hook
  }

  componentWillMount() {}
  componentDidMount() {}
}

مثال عملي — Builder Pattern vs Template Method

الـ Template Method يشبه مدير مشروع يضع خطة عمل — الفرق تنفذ المهام، لكن المدير يتحكم بالتسلسل.

from abc import ABC, abstractmethod

class Meal(ABC):
    def prepare(self):  # Template Method
        self.gather_ingredients()
        self.cook()
        self.serve()
        if self.add_extra():  # Hook
            self.add_garnish()

    def gather_ingredients(self):
        print("جمع المكونات")

    @abstractmethod
    def cook(self): ...

    def serve(self):
        print("تقديم الطبق")

    def add_extra(self):  # Hook
        return False

    def add_garnish(self):
        print("إضافة زينة")


class Pasta(Meal):
    def cook(self):
        print("طهي المعكرونة")

    def add_extra(self):
        return True

    def add_garnish(self):
        print("إضافة جبنة بارميزان")


class Salad(Meal):
    def cook(self):
        print("تقطيع الخضار")


Pasta().prepare()
Salad().prepare()

الخلاصة

  • الـ Template Method يحدد هيكل الخوارزمية ويترك التفاصيل للفئات الفرعية.
  • يستخدم Hooks لمنح الفئات الفرعية نقاط تمدّد اختيارية.
  • يطبق مبدأ DRY ومبدأ Hollywood: "لا تتصل بنا، نحن سنتصل بك".

🎯 التالي: نمطا Iterator و Composite

شرح نمط Template Method — أنماط التصميم (Design Patterns) بالعربي
نمط Template Methodأنماط التصميم (Design Patterns) بالعربي · The Code Fix

📚 لمزيد من التعمّق في أنماط التصميم (Design Patterns)، راجِع البرمجة الكائنية على ويكيبيديا.

هل كان هذا الدرس مفيدًا؟