سؤال

لقد راجعت مع مقالة ويكيبيديا, ، ويبدو أنه يفتقد إصدار c++ لمثال التعليمات البرمجية.لا أستطيع تقدير نمط الواجهة بشكل كامل بدون ذلك، هل يمكنك مساعدتي في شرحه لي باستخدام لغة C++؟

هل كانت مفيدة؟

المحلول

نمط الواجهة:يوفر واجهة موحدة ومبسطة لنظام فرعي معقد أو مجموعة من الواجهات.فهو يوفر واجهة ذات مستوى أعلى تفصل العميل في نفس الوقت عن النظام الفرعي المعقد.

مثال ليساعدك على الفهم..سائق سيارة أجرة.تخبر سائق سيارة الأجرة "خذني إلى PointX" (واجهة موحدة ومبسطة عالية المستوى) الذي يبدأ بعد ذلك في سلسلة من الإجراءات (يدير المفتاح، ويغير التروس، ويضغط على دواسة الوقود، وما إلى ذلك...) لتنفيذ المهمة.فهو يزيل تعقيد الأنظمة الفرعية الأساسية (علبة التروس، المحرك، وما إلى ذلك) بحيث لا داعي للقلق بشأنها.يقوم السائق أيضًا بفصلك عن السيارة الفعلية المستخدمة ...أنت لا تتفاعل مباشرة مع السيارة.من المحتمل أن تمنحه Merc لكن الواجهة الخاصة بك للسائق ستظل هي TakeMeTo(X)..أنت لست مقيدًا بأي طراز/نوع معين من السيارة.

في مثال من العالم الحقيقي، ستجد واجهات تتفاعل فيها مع مكونات أو مكتبات تابعة لجهات خارجية.لا تريد أن يعتمد الكود الخاص بك على بائع محدد، لذا يمكنك تقديم واجهة واجهة لفصلها.كما ستقوم بتبسيط هذه الواجهة، على سبيل المثال.ستحتوي واجهة الواجهة الخاصة بك على طريقة تسمى SendData( string ) ولكن داخليًا قد يستدعي التنفيذ طرق n على حزم فرعية m بترتيب محدد لإنجاز المهمة.هذا ما يوضحه الرسم البياني الموجود على صفحة ويكيبيديا.

على سبيل المثالجار الترجمة مثال إلى C++ وإبقائه صغيرًا

sResource = LWCPPSimple::get("http://www.perl.org")

هنا تعد مكتبة WWW الوهمية في لغة C++ واجهة توحد جوانب البروتوكول والشبكة والتحليل للمشكلة حتى أتمكن من التركيز على تركيزي الأساسي المتمثل في جلب المورد.يخفي الأسلوب get/يغلف/يحتفظ في مكان واحد بالتعقيد (وفي بعض الحالات القبح) لبروتوكولات HTTP وFTP والبروتوكولات المتنوعة الأخرى والاستجابة للطلبات وإدارة الاتصال وما إلى ذلك.وأيضًا، إذا وجد منشئو LWCPPSimple غدًا طريقة لجعل get() أسرع مرتين، فسوف أحصل على مزايا الأداء مجانًا.ليس من الضروري أن يتغير رمز عميلي.

نصائح أخرى

class Engine
{

public:
    void Start() { }

};

class Headlights
{

public:
    void TurnOn() { }

};

//  That's your facade.
class Car
{

private:
    Engine engine;
    Headlights headlights;

public:
    void TurnIgnitionKeyOn()
    {
        headlights.TurnOn();
        engine.Start();
    }

};

int Main(int argc, char *argv[])
{
    //  Consuming facade.
    Car car;
    car.TurnIgnitionKeyOn();

    return 0;
}

ولقد فعلت البحث والاستبدال على سبيل المثال C #. هذا قد لا تساعدك، لأنه إذا فهم C ++ ثم يجب أن تكون قادرا على فهم C # كما أنه يستخدم نفس بنيات والكلمات الرئيسية (الطبقات، وظائف، بمساحات، الجمهور، الخ)

// "Subsystem ClassA" 
#include <iostream>
class SubSystemOne
{
public:
    void MethodOne()
    {
        std::cout << " SubSystemOne Method" << std::endl;
    }
}

// Subsystem ClassB" 

class SubSystemTwo
{
public:
    void MethodTwo()
    {
        std::cout << " SubSystemTwo Method" << std::endl;
    }
}

// Subsystem ClassC" 

class SubSystemThree
{
public:
    void MethodThree()
    {
            std::cout << " SubSystemThree Method" << std::endl;
    }
}

// Subsystem ClassD" 

class SubSystemFour
{
public:
    void MethodFour()
    {
        std::cout << " SubSystemFour Method" << std::endl;
    }
}

// "Facade" 

class Facade
{
    SubSystemOne one;
    SubSystemTwo two;
    SubSystemThree three;
    SubSystemFour four;

public:
    Facade()
    {
    }

    void MethodA()
    {
        std::cout << "\nMethodA() ---- " << std::endl;
        one.MethodOne();
        two.MethodTwo();
        four.MethodFour();
    }
    void MethodB()
    {
        std::cout << "\nMethodB() ---- " << std::endl;
        two.MethodTwo();
        three.MethodThree();
    }
}

int Main()
{
    Facade facade = new Facade();

    facade.MethodA();
    facade.MethodB();

    return 0;
}

في معنى واحد، وهو واجهة هو مجرد API للعملاء الذي يريد أن تتفاعل مع شيء مخفي.

واجهة غير مفيدة عند تعريض C API بسيط لشيء أن يكون تنفيذها في C ++ أو ببساطة أكثر تعقيدا من API. أو للحصول على حاجز ثابت بين عميل ومكتبة عندما تحتاج مكتبة للذهاب من خلال العديد من التحديثات المتكررة وتريد أن تؤثر على العميل أقل قدر ممكن. على سبيل المثال، إذا تحتاج مكتبة C استنادا إلى تحديث داخليا لC ++ أو أي شيء آخر، أو تبادلت فقط عن شيء مختلف تماما، ثم واجهة هو حسن طبقة المتوسطة للعميل.

وهناك الأمثلة C ++ لل<لأ href = "HTTP: //www.vincehuston كافيه / موانئ دبي / facade.html "يختلط =" نوفولو noreferrer "> واجهة في هذا الموقع الممتاز على أنماط التصميم.

class A {
    private B b; // Class A uses Class B, the "interface"
    public int f() { return b.g(); }
};

class B {
    private C c; // class B uses class C, a "subsystem"
    private ... ...; // other subsystems can be added
    public int g() { c.h(); return c.i(); }
};

class C { // a subsystem
    public void h() { ... }
    public int i() { return x; }
};

وسوف الفئة (أ) عدم استخدام أية أساليب مباشرة أو تؤثر بشكل مباشر على الدولة من الدرجة C أو أي الفرعي الآخر الذي يحتوي على الفئة B. فقط يظهر الفرعي واحد هنا لأنه لا يهم كم الفرعية هناك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top