أنماط التصميم في C# للمتقدمين: من النظرية إلى الكود
\n\nأنماط التصميم ليست مجرد مفاهيم نظرية من الكتب الدراسية. بالنسبة لمطور C# ذي الخبرة، تصبح مجموعة أدوات تسمح بإنشاء بنية تطبيقات مرنة وقابلة للتوسع والصيانة. في هذه المقالة، سنحلل ثلاثة أنماط قوية غالبًا ما تبقى خارج نطاق الدورات الأساسية: Visitor وStrategy وCommand. سترى ليس فقط تنفيذها في C#، بل ستفهم أيضًا كيف تحل مشكلات حقيقية في نظام .NET البيئي.
\n\n1. نمط Visitor (الزائر) — العمل مع التسلسل الهرمي للكائنات
\n\nيسمح نمط Visitor بإضافة عمليات جديدة إلى الفئات الموجودة دون تغيير هيكلها. هذا مفيد بشكل خاص عندما يكون لديك تسلسل هرمي معقد للكائنات وتريد تنفيذ إجراءات مختلفة بناءً على نوعها.
\n\nالمشكلة
\nتخيل أن لديك نظامًا لإدارة المستندات يحتوي على فئات TextDocument وSpreadsheet وPresentation. تحتاج إلى إضافة وظيفة التصدير إلى PDF وHTML وXML. بدون نمط Visitor، سيتعين عليك تعديل كل فئة، مما ينتهك مبدأ الفتح/الإغلاق (OCP).
التنفيذ في C#
\n// 1. واجهة العنصر\npublic interface IElement\n{\n void Accept(IVisitor visitor);\n}\n\n// 2. العناصر الملموسة\npublic class TextDocument : IElement\n{\n public string Content { get; set; }\n public void Accept(IVisitor visitor) => visitor.Visit(this);\n}\n\npublic class Spreadsheet : IElement\n{\n public List<List<string>> Rows { get; set; }\n public void Accept(IVisitor visitor) => visitor.Visit(this);\n}\n\n// 3. واجهة الزائر\npublic interface IVisitor\n{\n void Visit(TextDocument doc);\n void Visit(Spreadsheet sheet);\n}\n\n// 4. زائر ملموس — التصدير إلى HTML\npublic class HtmlExportVisitor : IVisitor\n{\n public void Visit(TextDocument doc)\n {\n Console.WriteLine($"<h1>{doc.Content}</h1>");\n }\n\n public void Visit(Spreadsheet sheet)\n {\n Console.WriteLine("<table>");\n foreach (var row in sheet.Rows)\n {\n Console.WriteLine("<tr><td>" + string.Join("</td><td>", row) + "</td></tr>");\n }\n Console.WriteLine("</table>");\n }\n}\n\n// الاستخدام\nvar docs = new List<IElement> { new TextDocument { Content = "مرحبًا" }, new Spreadsheet { Rows = new List<List<string>> { new List<string> { "A", "B" } } } };\nvar visitor = new HtmlExportVisitor();\nforeach (var doc in docs) doc.Accept(visitor);\n\nالإيجابيات: سهولة إضافة عمليات جديدة دون تعديل الفئات الموجودة. السلبيات: إذا تغير التسلسل الهرمي للعناصر بشكل متكرر، يصبح Visitor غير مريح.
\n\n2. نمط Strategy (الإستراتيجية) — التبديل الديناميكي للخوارزميات
\n\nيسمح نمط Strategy بتعريف مجموعة من الخوارزميات، وتغليف كل منها، وجعلها قابلة للتبادل. هذه طريقة كلاسيكية لتجنب هياكل if-else أو switch الضخمة.
المشكلة
\nتحتاج إلى تنفيذ نظام لحساب تكلفة الشحن. طرق الشحن مختلفة: توصيل سريع، بريد، استلام شخصي. كل طريقة لها منطق حساب السعر الخاص بها.
\n\nالتنفيذ في C#
\n// 1. واجهة الإستراتيجية\npublic interface IShippingStrategy\n{\n decimal CalculateCost(Order order);\n}\n\n// 2. استراتيجيات ملموسة\npublic class CourierShipping : IShippingStrategy\n{\n public decimal CalculateCost(Order order) => order.Weight * 5.0m + 100;\n}\n\npublic class PostShipping : IShippingStrategy\n{\n public decimal CalculateCost(Order order) => order.Weight * 2.0m + 50;\n}\n\npublic class PickupShipping : IShippingStrategy\n{\n public decimal CalculateCost(Order