أنماط التصميم في Kotlin: تقنيات متقدمة مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أنماط التصميم في Kotlin مع أمثلة: المستوى المتقدم

\n\n

أنماط التصميم هي حلول مثبتة للمشكلات النمطية في تطوير البرمجيات. إذا كنت قد أتقنت بالفعل الأنماط الأساسية (Singleton، Factory، Observer)، فقد حان الوقت للانتقال إلى المستوى التالي. في هذه المقالة، سنشرح أربعة أنماط متقدمة — سلسلة المسؤوليات، المفسر، الوسيط واللقطة — ونعرض تطبيقها في Kotlin مع مراعاة مصطلحات اللغة (sealed class، extension functions، لامبدا).

\n\n

1. سلسلة المسؤوليات (Chain of Responsibility)

\n\n

الغرض: يسمح بتمرير الطلب بالتسلسل عبر سلسلة من المعالجات حتى يقوم أحدهم بمعالجته.

\n\n

المشكلة: نظام تسجيل حيث يجب معالجة الرسائل ذات المستويات المختلفة (DEBUG، INFO، ERROR) بواسطة مسجلات مختلفة.

\n\n

التطبيق في Kotlin:

\n\n
// معالج مجرد\nabstract class Logger(private val level: Int) {\n    private var nextLogger: Logger? = null\n\n    fun setNext(logger: Logger): Logger {\n        this.nextLogger = logger\n        return logger\n    }\n\n    fun log(level: Int, message: String) {\n        if (this.level <= level) {\n            write(message)\n        }\n        nextLogger?.log(level, message)\n    }\n\n    protected abstract fun write(message: String)\n}\n\n// معالجات محددة\nclass ConsoleLogger(level: Int) : Logger(level) {\n    override fun write(message: String) = println("[Console] $message")\n}\n\nclass FileLogger(level: Int) : Logger(level) {\n    override fun write(message: String) = println("[File] $message")\n}\n\nclass EmailLogger(level: Int) : Logger(level) {\n    override fun write(message: String) = println("[Email] $message")\n}\n\n// الاستخدام\nfun main() {\n    val logger = ConsoleLogger(1).apply {\n        setNext(FileLogger(2))\n            .setNext(EmailLogger(3))\n    }\n    logger.log(2, "تحذير: انخفاض مستوى الذاكرة")\n    // الإخراج:\n    // [Console] تحذير: انخفاض مستوى الذاكرة\n    // [File] تحذير: انخفاض مستوى الذاكرة\n}
\n\n

المزايا في Kotlin: بفضل apply والاستدعاء المتسلسل لـ setNext، يبدو الكود موجزًا. يمكن أيضًا استبدال الفئة المجردة بواجهة مع تطبيق افتراضي.

\n\n

2. المفسر (Interpreter)

\n\n

الغرض: يحدد قواعد اللغة ويفسر جمل هذه اللغة.

\n\n

المشكلة: الحاجة إلى تحليل وحساب تعبيرات حسابية بسيطة (مثل "3 + 5 - 2").

\n\n

التطبيق في Kotlin باستخدام sealed class:

\n\n
// تعبير مجرد\nsealed class Expression {\n    abstract fun interpret(): Int\n}\n\n// تعبير طرفي — رقم\ndata class Number(val value: Int) : Expression() {\n    override fun interpret() = value\n}\n\n// تعبيرات غير طرفية — عمليات\ndata class Add(val left: Expression, val right: Expression) : Expression() {\n    override fun interpret() = left.interpret() + right.interpret()\n}\n\ndata class Subtract(val left: Expression, val right: Expression) : Expression() {\n    override fun interpret() = left.interpret() - right.interpret()\n}\n\n// المحلل (مبسط)\nfun parse(tokens: List<String>): Expression {\n    val stack = mutableListOf<Expression>()\n    var i = 0\n    while (i < tokens.size) {\n        when (tokens[i]) {\n            "+" -> {\n                val right = Number(tokens[++i].toInt())\n                val left = stack.removeLast()\n                stack.add(Add(left, right))\n            }\n            "-" -> {\n                val right = Number(tokens[++i].toInt())\n                val left = stack.removeLast()\n                stack.add(Subtract(left, right))\n            }\n            else -> stack.add(Number(tokens[i]                

المدونات

توصيات الكتب