أنماط التصميم المتقدمة في Swift: من النظرية إلى التطبيق
أنماط التصميم ليست مجرد مفاهيم نظرية، بل هي حلول مجربة عبر الزمن للمشكلات النمطية. إذا كنت قد أتقنت بالفعل الأنماط الأساسية (Singleton, Delegate, MVC) وتعمل على تطبيقات iOS/macOS معقدة، فقد حان الوقت للانتقال إلى المستوى التالي. في هذه المقالة، سنشرح أربعة أنماط متقدمة: Builder، Strategy، Observer (عبر Combine) و Coordinator. سيتم توضيح كل نمط بكود حقيقي بلغة Swift ونصائح لدمجه في المشاريع القائمة.
1. Builder — إعداد مرن للكائنات المعقدة
نمط Builder مثالي لإنشاء كائنات تحتوي على العديد من المعاملات الاختيارية. بدلاً من استخدام أدوات التهيئة الطويلة ذات العشرات من المعاملات، يمكنك استخدام البناء التدريجي.
مثال: إعداد UIAlertController
class AlertBuilder { private var title: String? private var message: String? private var actions: [UIAlertAction] = [] private var preferredStyle: UIAlertController.Style = .alert
func setTitle(_ title: String) -> AlertBuilder { self.title = title return self }
func setMessage(_ message: String) -> AlertBuilder { self.message = message return self }
func addAction(title: String, style: UIAlertAction.Style = .default, handler: ((UIAlertAction) -> Void)? = nil) -> AlertBuilder { let action = UIAlertAction(title: title, style: style, handler: handler) actions.append(action) return self }
func setStyle(_ style: UIAlertController.Style) -> AlertBuilder { self.preferredStyle = style return self }
func build() -> UIAlertController { let alert = UIAlertController(title: title, message: message, preferredStyle: preferredStyle) actions.forEach { alert.addAction($0) } return alert }}
// الاستخدامlet alert = AlertBuilder() .setTitle("خطأ") .setMessage("فشل تحميل البيانات") .addAction(title: "موافق", style: .default) .addAction(title: "إعادة المحاولة", style: .cancel) .build()present(alert, animated: true)متى تستخدم: عند إنشاء أدوات التهيئة، أو ViewControllers المعقدة، أو نماذج البيانات التي تحتوي على عدد كبير من الخيارات.
2. Strategy — تبديل الخوارزميات أثناء التشغيل
نمط Strategy يسمح بتجميع مجموعة من الخوارزميات وجعلها قابلة للتبادل. هذا مفيد بشكل خاص لمعالجة المدفوعات، أو التحقق من صحة البيانات، أو التقديم.
مثال: نظام تصفية المحتوى
protocol FilterStrategy { func apply(to items: [String]) -> [String]}
class AlphabeticalFilter: FilterStrategy { func apply(to items: [String]) -> [String] { return items.sorted() }}
class LengthFilter: FilterStrategy { func apply(to items: [String]) -> [String] { return items.filter { $0.count > 5 } }}
class ContentManager { private var strategy: FilterStrategy
init(strategy: FilterStrategy) { self.strategy = strategy }
func setStrategy(_ strategy: FilterStrategy) { self.strategy = strategy }
func filter(items: [String]) -> [String] { return strategy.apply(to: items) }}
// الاستخدامlet manager = ContentManager(strategy: AlphabeticalFilter())let data = ["Swift", "Objective-C", "Kotlin", "Java", "Python"]print(manager.filter(items: data)) // ["Java", "Kotlin", "Objective-C", "Python", "Swift"]
manager.setStrategy(LengthFilter())print(manager.filter(items: data)) // ["Objective-C", "Python"]نصيحة: ادمج Strategy مع طريقة المصنع لاختيار الاستراتيجية بناءً على إعدادات المستخدم.