Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نمط طريقة القالب

جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 52 من 64.

يحدد نمط "Template Method Pattern" الهيكل الأساسي لخوارزمية في فئة أساسية، مما يسمح للفئات الفرعية بتجاوز (override) خطوات محددة دون تغيير هيكل الخوارزمية.

إليك فئة أساسية تحتوي على طريقة قالب (template method):

class DataProcessor:
    def process(self):
        """طريقة القالب التي تحدد هيكل الخوارزمية"""
        self.read_data()
        self.process_data()
        self.save_data()
    
    def read_data(self):
        print("Reading data...")
    
    def process_data(self):
        raise NotImplementedError("Subclasses must implement this")
    
    def save_data(self):
        print("Saving data...")

تحدد طريقة القالب process() خطوات الخوارزمية، بينما تُترك process_data() للفئات الفرعية لتنفيذها.

قم بإنشاء فئات ملموسة (concrete classes) تقوم بتنفيذ الطريقة المجردة (abstract method):

class CSVProcessor(DataProcessor):
    def process_data(self):
        print("Processing CSV data")

class JSONProcessor(DataProcessor):
    def process_data(self):
        print("Processing JSON data")

توفر كل فئة ملموسة تنفيذها الخاص للخطوة المطلوبة.

استخدم طريقة القالب (template method):

csv_processor = CSVProcessor()
csv_processor.process()

print()  # سطر فارغ

json_processor = JSONProcessor()
json_processor.process()

أنشئ مثالاً آخر باستخدام قالب لعبة:

class Game:
    def play(self):
        """Template method for playing a game"""
        self.start_game()
        self.play_game()
        self.end_game()
    
    def start_game(self):
        print("Game started!")
    
    def play_game(self):
        raise NotImplementedError("Define the game rules")
    
    def end_game(self):
        print("Game ended!")

class Chess(Game):
    def play_game(self):
        print("Playing chess - thinking strategically...")

class Soccer(Game):
    def play_game(self):
        print("Playing soccer - running and kicking...")

chess = Chess()
chess.play()

الناتج:

Reading data...
Processing CSV data
Saving data...

Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!

نقطة رئيسية: يحدد نمط طريقة القالب (Template Method Pattern) هيكلاً مشتركاً للخوارزمية في الفئة الأب (parent class) بينما يسمح للفئات الفرعية (subclasses) بتخصيص خطوات محددة. تتحكم الفئة الأب في التدفق العام، ولكن الفئات الفرعية توفر التنفيذات المحددة. يضمن ذلك هيكلاً متسقاً مع السماح بالمرونة في الخطوات الفردية.

challenge icon

التحدي

متوسط

قم بتنفيذ template.py و driver.py مع التغليف والأساليب المناسبة. اتبع تعليقات TODO للحصول على إرشادات خطوة بخطوة.

ورقة مرجعية

يحدد نمط "طريقة القالب" (Template Method Pattern) الهيكل العظمي لخوارزمية في فئة أساسية، مما يسمح للفئات الفرعية بتجاوز خطوات محددة دون تغيير هيكل الخوارزمية.

قم بإنشاء فئة أساسية تحتوي على طريقة قالب:

class DataProcessor:
    def process(self):
        """طريقة قالب تحدد هيكل الخوارزمية"""
        self.read_data()
        self.process_data()
        self.save_data()
    
    def read_data(self):
        print("Reading data...")
    
    def process_data(self):
        raise NotImplementedError("Subclasses must implement this")
    
    def save_data(self):
        print("Saving data...")

قم بإنشاء فئات ملموسة تنفذ الطريقة المجردة:

class CSVProcessor(DataProcessor):
    def process_data(self):
        print("Processing CSV data")

class JSONProcessor(DataProcessor):
    def process_data(self):
        print("Processing JSON data")

استخدم طريقة القالب:

csv_processor = CSVProcessor()
csv_processor.process()

json_processor = JSONProcessor()
json_processor.process()

يحدد نمط "طريقة القالب" هيكلاً مشتركاً للخوارزمية في الفئة الأب مع السماح للفئات الفرعية بتخصيص خطوات محددة. تتحكم الفئة الأب في التدفق العام، لكن الفئات الفرعية توفر التنفيذات المحددة.

جرّب بنفسك

from template import Template

# معالج حالة الاختبار
test_case = input()

if test_case == "basic_test":
    # TODO: "Test Name" باسم Template قم بإنشاء كائن
    # TODO: للكائن display_info() استدعِ الدالة
    pass
elif test_case == "validation_test":
    # TODO: "Validation Test" باسم Template قم بإنشاء كائن
    # TODO: "Name: {obj.name}" :اطبع الاسم باستخدام خاصية الاسم بالتنسيق التالي
    pass
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming