1. ما هو نمط واجهة الواجهة (Facade Pattern)

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

2. السمات والمزايا لنمط واجهة الواجهة

نمط واجهة الواجهة له السمات والمزايا التالية:

  • يوفر واجهة مبسطة، مما يجعل النظام الفرعي أسهل في الاستخدام.
  • يقلل من الربط بين العميل والنظام الفرعي. العميل يحتاج فقط إلى التفاعل مع فئة الواجهة دون الحاجة إلى فهم التفاصيل التنفيذية الspecifi المحددة للنظام الفرعي.
  • يتوافق مع مبدأ المفتوح/المغلق ويسمح بإضافة أو تعديل الوظائف بشكل مريح في النظام الفرعي.

3. أمثلة لتطبيقات نمط واجهة الواجهة العملية

نمط واجهة الواجهة له مجموعة واسعة من التطبيقات العملية في التطوير، مثل:

  • توفير واجهة مبسطة للوصول إلى مكتبات أو واجهات برمجة تطبيقات خارجية معقدة.
  • كبسولة مجموعة من عمليات المنطق المعقدة لتبسيط عملية استدعاء العميل.
  • توفير واجهة بسيطة لنظام موجود للتكامل مع أنظمة أخرى.

4. تنفيذ نمط واجهة الواجهة في Golang

4.1. رسم بياني لفئة UML

نمط واجهة الواجهة في جولانغ

4.2. مقدمة المثال

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

4.3. خطوة التنفيذ 1: تعريف فئة الواجهة

type Facade struct {
    subsystemA *SubsystemA
    subsystemB *SubsystemB
    subsystemC *SubsystemC
}

func NewFacade() *Facade {
    return &Facade{
        subsystemA: NewSubsystemA(),
        subsystemB: NewSubsystemB(),
        subsystemC: NewSubsystemC(),
    }
}

func (f *Facade) Operation() {
    f.subsystemA.OperationA()
    f.subsystemB.OperationB()
    f.subsystemC.OperationC()
}

4.4. خطوة التنفيذ 2: تعريف فئات النظام الفرعي

type SubsystemA struct {}

func NewSubsystemA() *SubsystemA {
    return &SubsystemA{}
}

func (s *SubsystemA) OperationA() {
    // منطق عمليات النظام الفرعي A
}

type SubsystemB struct {}

func NewSubsystemB() *SubsystemB {
    return &SubsystemB{}
}

func (s *SubsystemB) OperationB() {
    // منطق عمليات النظام الفرعي B
}

type SubsystemC struct {}

func NewSubsystemC() *SubsystemC {
    return &SubsystemC{}
}

func (s *SubsystemC) OperationC() {
    // منطق عمليات النظام الفرعي C
}

4.5. خطوة التنفيذ 3: تنفيذ كود العميل باستخدام نمط واجهة الواجهة

func main() {
    facade := NewFacade()
    facade.Operation()
}