December 20, 2025 (8mo ago) — last updated May 8, 2026 (3mo ago)

أنماط التصميم في OOP: دليل عملي موجز

دليل عملي لأنماط التصميم في OOP: إنشائية، بنيوية، وسلوكية مع أمثلة TypeScript لرفع جودة الكود والقابلية للصيانة.

← Back to blog
Cover Image for أنماط التصميم في OOP: دليل عملي موجز

أنماط التصميم في البرمجة الموجهة للكائنات تحوّل الحلول المتكررة إلى قوالب قابلة لإعادة الاستخدام. هذا الدليل العملي يشرح الأنماط الإنشائية والبنيوية والسلوكية مع أمثلة TypeScript عملية لتطبيقها بسرعة وتحسين قابلية الصيانة.

دليل عملي لأنماط التصميم في البرمجة الموجهة للكائنات

اتقن أنماط التصميم في البرمجة الموجهة للكائنات مع هذا الدليل العملي المختصر. تعرّف على الأنماط الإنشائية والبنيوية والسلوكية، مع أمثلة TypeScript عملية لتطبيقها بسرعة في مشروعاتك.

المقدمة

أنماط التصميم في البرمجة الموجهة للكائنات هي حلول مثبتة تُسهِم في تنظيم الفئات والكائنات لتسهيل الصيانة والاختبار والتوسيع. ليست شفرات تُنسخ وتُلصق؛ بل قوالب قابلة للتكييف تساعدك على توضيح نية التصميم لزملائك وإعادة هيكلة الكود بأمان.

فهم الأنماط الشائعة—الإنشائية والبنيوية والسلوكية—يسهّل اختيار الأداة المناسبة للمشكلة ويقلّل المخاطر المعمارية. كتاب "Design Patterns" يوثق 23 نمطًا أساسيًا تُستخدم على نطاق واسع في الصناعة.1 كما توجد أساسات بحثية تُدعم إعادة استخدام الأنماط في البيئات الهندسية المعقدة.2

لمحة سريعة: ما هي أنماط التصميم في OOP

البرمجة بدون أنماط تصميم قد تؤدي إلى قاعدة كود متشابكة يصعب توسيعها. اعتبر الأنماط وصفات عملية يمكن تكييفها لتحقيق نتائج متسقة وقابلة للصيانة عبر المشاريع.

مخطط قبعة طاهٍ تسقط أشكال أحرف ذهبية في كتاب طبخ مفتوح.

لغة مشتركة بين المطورين

أكبر فائدة للأنماط هي وجود مفردات مشتركة. ذكر "Factory" أو "Singleton" يكفي ليعطي زملاءك رؤية سريعة عن النية والبنية على مستوى عالٍ.

النمط التصميمي ليس تصميمًا منتهيًا يمكن تحويله مباشرة إلى كود. إنه قالب لحل مشكلة يمكن تطبيقه بطرق مختلفة.

راجع المقارنة العملية بين التعدد الشكلي والوراثة في دليلنا: التعدد الشكلي مقابل الوراثة.

الفئات الثلاث الأساسية لأنماط التصميم

نظّم "عصابة الأربعة" الأنماط في ثلاث فئات: إنشائية، بنيوية، وسلوكية. معرفة هذه الفئات تساعدك على اختيار النهج المناسب لكل مشكلة بسرعة.

مخطط يوضّح الأنماط الإنشائية والبنيوية والسلوكية مع رسومات صندوق بسيطة.

نظرة عامة على الفئات

فئة النمطالغرض الأساسيأمثلة شائعة
إنشائيةفصل وإدارة إنشاء الكائناتFactory, Builder, Singleton, Prototype
بنيويةتجميع الفئات والكائنات لهياكل مرنةAdapter, Decorator, Facade, Composite
سلوكيةتنظيم تفاعل الكائنات ومسؤولياتهاObserver, Strategy, Command, Iterator

أنماط إنشائية — فصل منطق الإنشاء

الأنماط الإنشائية تُخفِي منطق إنشاء الكائنات بحيث لا يرتبط كود العميل بالفئات الملموسة. هذا يسهل تبديل التنفيذات واقتناص فرص الاختبار.

رسم توضيحي يقارن كائنات فردية تشبه البيض مع خط تجميع يُنتج عناصر ملونة.

Singleton: متى تستخدمه ومتى تتجنّبه

Singleton يضمن وجود مثيل واحد لفئة ما ويوفّر نقطة وصول عالمية. مفيد لموارد مشتركة مثل اتصال قاعدة البيانات أو المسجّل، لكنه قد يعرّضك لحالة عالمية تُصعّب الاختبار وإدارة التبعيات. استخدمه فقط للموارد العالمية الحقيقية وفضّل حقن التبعيات للاختبار والأسلوبية الأفضل.3

مثال: Singleton في TypeScript لاتصال قاعدة البيانات.

class DatabaseConnection {
  private static instance: DatabaseConnection;

  private constructor() {
    console.log("Connecting to the database...");
  }

  public static getInstance(): DatabaseConnection {
    if (!DatabaseConnection.instance) {
      DatabaseConnection.instance = new DatabaseConnection();
    }
    return DatabaseConnection.instance;
  }

  public query(sql: string): void {
    console.log(`Executing query: ${sql}`);
  }
}

const db1 = DatabaseConnection.getInstance();
const db2 = DatabaseConnection.getInstance();

db1.query("SELECT * FROM users");
console.log(db1 === db2); // true

Factory Method: فصل قرار الإنشاء عن العميل

Factory Method يعرّف واجهة لإنشاء كائن، وتقرّر الفئات الفرعية أي منتج ملموس تُنشئ. هذا يُبقي العميل غير معرّف بالفئات الملموسة ويُسهّل الإضافة لاحقًا.

مثال: أزرار بأنماط أنظمة تشغيل مختلفة.

interface Button {
  render(): void;
  onClick(f: () => void): void;
}

class WindowsButton implements Button {
  render() { console.log("Rendering a button in Windows style."); }
  onClick(f: () => void) { console.log("Windows button click event."); f(); }
}

class MacButton implements Button {
  render() { console.log("Rendering a button in macOS style."); }
  onClick(f: () => void) { console.log("Mac button click event."); f(); }
}

abstract class Dialog {
  abstract createButton(): Button;

  render() {
    const okButton = this.createButton();
    okButton.render();
  }
}

class WindowsDialog extends Dialog {
  createButton(): Button { return new WindowsButton(); }
}

class MacDialog extends Dialog {
  createButton(): Button { return new MacButton(); }
}

const os: string = "windows";
let dialog: Dialog;
if (os === "windows") dialog = new WindowsDialog(); else dialog = new MacDialog();
dialog.render();

أنماط بنيوية — تجميع ومطابقة الواجهات

الأنماط البنيوية تساعدك على تركيب الأنظمة من مكوّنات قابلة للتبديل والتوسيع. الأمثلة العملية: Adapter وDecorator.

رسومات مرسومة باليد لمحول كهربائي وركم حلقات تمثل أنماط تصميم OOP.

Adapter: جسر بين واجهات غير متوافقة

Adapter يلف واجهة غير متوافقة لتتوافق مع ما يتوقعه نظامك، مما يسهّل دمج مكتبات طرف ثالث دون تغييرات تدخّلية في الكود القديم.

مثال: تكييف ModernLogger مع واجهة ILogger الحالية.

class ModernLogger {
  public logInfo(message: string): void {
    console.log(`[INFO]: ${message}`);
  }
}

interface ILogger { log(message: string): void; }

class LoggerAdapter implements ILogger {
  private modernLogger: ModernLogger;
  constructor() { this.modernLogger = new ModernLogger(); }
  public log(message: string): void { this.modernLogger.logInfo(message); }
}

const logger: ILogger = new LoggerAdapter();
logger.log("User logged in successfully.");

Decorator: إضافة وظائف ديناميكيًا

Decorator يضيف مسؤوليات إلى الكائنات في وقت التشغيل عن طريق تغليفها، وهو أكثر مرونة من إنشاء فئات فرعية ويُراعي مبدأ المسؤولية الوحيدة.

interface Subscription { getDescription(): string; getCost(): number; }

class BasicSubscription implements Subscription {
  getDescription(): string { return "Basic Plan"; }
  getCost(): number { return 10; }
}

abstract class SubscriptionDecorator implements Subscription {
  protected subscription: Subscription;
  constructor(subscription: Subscription) { this.subscription = subscription; }
  abstract getDescription(): string;
  abstract getCost(): number;
}

class PremiumSupportDecorator extends SubscriptionDecorator {
  getDescription(): string { return `${this.subscription.getDescription()}, Premium Support`; }
  getCost(): number { return this.subscription.getCost() + 5; }
}

class CloudStorageDecorator extends SubscriptionDecorator {
  getDescription(): string { return `${this.subscription.getDescription()}, 1TB Cloud Storage`; }
  getCost(): number { return this.subscription.getCost() + 7; }
}

let mySubscription: Subscription = new BasicSubscription();
mySubscription = new PremiumSupportDecorator(mySubscription);
mySubscription = new CloudStorageDecorator(mySubscription);
console.log(mySubscription.getDescription());
console.log(mySubscription.getCost());

أنماط سلوكية — تنظيم التفاعل ومسارات المسؤولية

الأنماط السلوكية تنظّم تواصل الكائنات لتبقى الأنظمة مرنة وقابلة للصيانة. أمثلة شائعة: Observer وStrategy.

Observer: إبلاغ المهتمين بالتغييرات

Observer يُنشئ علاقة واحد-إلى-عديد؛ عندما يتغير الموضوع تُبلّغ المراقِبون تلقائيًا. هذا يُقلّل الارتباط المباشر بين المكوّنات.

interface Subject { attach(observer: Observer): void; detach(observer: Observer): void; notify(): void; }
interface Observer { update(subject: Subject): void; }

class NotificationService implements Subject {
  public state: string = '';
  private observers: Observer[] = [];
  attach(observer: Observer): void { this.observers.push(observer); }
  detach(observer: Observer): void { const i = this.observers.indexOf(observer); if (i !== -1) this.observers.splice(i, 1); }
  notify(): void { for (const o of this.observers) o.update(this); }
  public createNewPost(title: string): void { this.state = `New Post: ${title}`; console.log(`\nNotificationService: A new post was created.`); this.notify(); }
}

class EmailNotifier implements Observer { public update(subject: Subject): void { if (subject instanceof NotificationService) console.log(`EmailNotifier: Sending email about "${subject.state}"`); } }
class PushNotifier implements Observer { public update(subject: Subject): void { if (subject instanceof NotificationService) console.log(`PushNotifier: Sending push notification for "${subject.state}"`); } }

const notificationService = new NotificationService();
const emailer = new EmailNotifier();
const pusher = new PushNotifier();
notificationService.attach(emailer);
notificationService.attach(pusher);
notificationService.createNewPost("Understanding Observer Pattern");
notificationService.detach(pusher);
notificationService.createNewPost("Why Strategy is Awesome");

Strategy: تبديل الخوارزميات بسهولة

Strategy يسمح بتبديل الخوارزميات في وقت التشغيل بدون كتل شروط معقّدة، ويُسهِم في الامتثال لمبدأ Open/Closed.4

interface PaymentStrategy { pay(amount: number): void; }
class CreditCardStrategy implements PaymentStrategy { pay(amount: number): void { console.log(`Paying $${amount} with Credit Card.`); } }
class PayPalStrategy implements PaymentStrategy { pay(amount: number): void { console.log(`Paying $${amount} via PayPal.`); } }

class ShoppingCart {
  private paymentStrategy: PaymentStrategy;
  constructor(strategy: PaymentStrategy) { this.paymentStrategy = strategy; }
  public setPaymentStrategy(strategy: PaymentStrategy) { this.paymentStrategy = strategy; }
  public checkout(amount: number): void { this.paymentStrategy.pay(amount); }
}

const cart = new ShoppingCart(new CreditCardStrategy());
cart.checkout(150);
cart.setPaymentStrategy(new PayPalStrategy());
cart.checkout(150);

مطبات تصميم شائعة وإعادة الهيكلة

اختيار نمط هو نصف الحل فقط. تجنّب الأنماط المضادة مثل God Object الذي يحتكر المسؤوليات ويخرق مبدأ المسؤولية الوحيدة. راقب روائح الكود—دوال طويلة، تبعيات مفرطة، أو فئات عملاقة—وعالجها بإعادة هيكلة منهجية.

إعادة الهيكلة تهدف إلى تحسين البنية الداخلية دون تغيير السلوك الخارجي، وهي الطريقة الآمنة لترويض الأنظمة القديمة.

إعادة الهيكلة إلى Strategy

سلاسل switch أو if/else الطويلة رائحة كود كلاسيكية. استخرج السلوك المتغير إلى واجهة Strategy واستبدل الشروط باستدعاء واحد، مما يُحسّن القابلية للاختبار والتوسيع والالتزام بمبادئ SOLID.4

أسئلة وأجوبة سريعة

ما الأنماط التي يجب أن أتعلم أولًا؟

ابدأ بـ Singleton, Factory, Adapter, Decorator, Observer وStrategy. تعلم متى تُستخدم كل نمط والمشكلة التي يحلّها.

متى عليّ تجنّب تطبيق نمط تصميم؟

تجنّب الأنماط التي تضيف تعقيدًا دون فائدة واضحة. اتبع مبدأ YAGNI: لا تضف نمطًا إلا عندما تكون المشكلة موجودة وحقيقية.

هل يمكن تطبيق أنماط التصميم في مشاريع تستخدم TypeScript؟

نعم. TypeScript شائعة في الصناعة وتُسهِم في تطبيق أنماط OOP بوضوح بفضل الأنواع والواجهات.5


في Clean Code Guy نساعد الفرق على بناء برمجيات تدوم عبر مراجعات كود موجهة وإعادة هيكلة عملية. اكتشف خدماتنا على https://cleancodeguy.com.

1.
Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley, 1994). [https://en.wikipedia.org/wiki/Design_Patterns](https://en.wikipedia.org/wiki/Design_Patterns)
2.
W. G. Griswold et al., “A Formal Foundation for Design Pattern Abstraction and Reuse,” Proceedings of ECOOP ’93, University of California, San Diego. https://cseweb.ucsd.edu/~wgg/CSE210/ecoop93-patterns.pdf
3.
Martin Fowler, “Singleton,” Bliki, discusses Singleton trade-offs and testing implications. https://martinfowler.com/bliki/Singleton.html
4.
Robert C. Martin (Uncle Bob), “The SOLID Principles,” explains Open/Closed and related design goals. https://8thlight.com/blog/uncle-bob/2012/08/13/the-s-o-l-i-d-principles.html
5.
Stack Overflow, Developer Survey 2023, shows strong industry adoption of TypeScript and modern JS tooling. [https://survey.stackoverflow.co/2023](https://survey.stackoverflow.co/2023)
← Back to blog
🙋🏻‍♂️

الذكاء الاصطناعي يكتب الكود.
أنت تجعله يدوم.

في عصر تسريع الذكاء الاصطناعي، الكود النظيف ليس مجرد ممارسة جيدة — إنه الفرق بين الأنظمة التي تتوسع وقواعد الكود التي تنهار تحت وزنها.