شارك المقالة
تعرف على شرح Adapter Design Pattern بالتفصيل مع مثال عملي في Java لتحويل البيانات بين XML وJSON، مع توضيح المميزات والعيوب ومتى يُستخدم نمط المحول.

شرح Adapter Design Pattern بالتفصيل مع مثال Java ومعرفة المميزات والعيوب

شرح Adapter Design Pattern بالتفصيل مع مثال توضيحي ومعرفة العيوب والمميزات


يُعد Adapter Design Pattern أحد أنماط التصميم الهيكلية (Structural Design Patterns) في البرمجة، ويهدف إلى تمكين الفئات ذات الواجهات غير المتوافقة من العمل معًا بسلاسة. يتم ذلك عن طريق إنشاء طبقة وسيطة تُسمى “المحول” تقوم بتحويل واجهة فئة معينة إلى واجهة أخرى يفهمها الكود الحالي دون الحاجة إلى تعديل الشيفرة الأصلية.
يُستخدم هذا النمط بكثرة عند التعامل مع أنظمة خارجية أو مكتبات قديمة، أو عند الحاجة إلى تحويل تنسيقات بيانات مختلفة مثل XML و JSON.
في هذه المقالة سنقدّم شرح Adapter Design Pattern بشكل عملي، مع مثال توضيحي باستخدام Java، ونقارن بين استخدام النمط وعدم استخدامه، مع استعراض المميزات والعيوب.

ما هو Adapter Design Pattern؟

يعمل نمط المحول على تمكين كائنات ذات واجهات غير متوافقة من التعاون معًا، وذلك من خلال إنشاء فئة Adapter تقوم بتحويل الواجهة غير المتوافقة إلى واجهة مناسبة يستطيع العميل التعامل معها.
بعبارة أبسط: المحول يعمل كوسيط بين نظامين لا يفهمان بعضهما مباشرة.

حالات استخدام Adapter Design Pattern

  • عند التعامل مع واجهات خارجية (APIs) غير متوافقة مع بنية النظام الحالي.
  • عند الرغبة في إعادة استخدام مكتبة أو كود قديم دون تعديل واجهته.
  • تحويل تنسيقات البيانات مثل XML إلى JSON أو العكس.

كود جافا بدون استخدام Adapter Design Pattern

في هذا المثال يتم تحويل البيانات بين XML و JSON مباشرة داخل الفئة الرئيسية دون وجود طبقة وسيطة.

import org.json.JSONObject;
import org.json.XML;

public class DataConverter {

    public String xmlToJson(String xmlData) {
        JSONObject jsonObject = XML.toJSONObject(xmlData);
        return jsonObject.toString();
    }

    public String jsonToXml(String jsonData) {
        JSONObject jsonObject = new JSONObject(jsonData);
        return XML.toString(jsonObject);
    }

    public static void main(String[] args) {
        DataConverter converter = new DataConverter();

        String xmlData = "<payment><amount>100</amount><currency>USD</currency></payment>";
        String jsonData = converter.xmlToJson(xmlData);
        System.out.println("JSON Data: " + jsonData);

        String xmlConvertedBack = converter.jsonToXml(jsonData);
        System.out.println("XML Data: " + xmlConvertedBack);
    }
}

مشاكل هذه الطريقة

  • ازدواجية التعليمات البرمجية: عند استخدام نفس منطق التحويل في أكثر من مكان.
  • قابلية التوسعة المحدودة: إضافة تنسيقات جديدة تتطلب تعديل الكود الأساسي.
  • عدم الفصل المنطقي: منطق التحويل مدمج داخل الفئة الرئيسية.

كود جافا باستخدام Adapter Design Pattern


interface DataAdapter {
    String convert(String data);
}

class XmlToJsonAdapter implements DataAdapter {
    @Override
    public String convert(String xmlData) {
        return XML.toJSONObject(xmlData).toString();
    }
}

class JsonToXmlAdapter implements DataAdapter {
    @Override
    public String convert(String jsonData) {
        return XML.toString(new JSONObject(jsonData));
    }
}

class DataConversionManager {
    private DataAdapter adapter;

    public void setAdapter(DataAdapter adapter) {
        this.adapter = adapter;
    }

    public String convertData(String data) {
        return adapter.convert(data);
    }
}

public class Main {
    public static void main(String[] args) {

        DataConversionManager manager = new DataConversionManager();

        manager.setAdapter(new XmlToJsonAdapter());
        String xmlData = "<payment><amount>100</amount><currency>USD</currency></payment>";
        String jsonData = manager.convertData(xmlData);
        System.out.println("JSON Data: " + jsonData);

        manager.setAdapter(new JsonToXmlAdapter());
        String xmlConvertedBack = manager.convertData(jsonData);
        System.out.println("XML Data: " + xmlConvertedBack);
    }
}

الاختلافات بين النهجين

بدون Adapter Design Pattern:
  • تعقيد عالي في الشيفرة البرمجية.
  • انخفاض قابلية التوسعة.
  • صعوبة اختبار الوحدة.
مع استخدام Adapter Design Pattern:
  • فصل واضح لمنطق التحويل.
  • سهولة إضافة محولات جديدة.
  • كود أنظف وأكثر مرونة.

مميزات Adapter Design Pattern

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

عيوب Adapter Design Pattern

  • زيادة التعقيد: بسبب زيادة عدد الفئات.
  • غير مناسب دائمًا: في الأنظمة ذات الاختلافات الجذرية الكبيرة.

الخلاصة

نمط المحول هو بالفعل كما يدل اسمه: محول. وهو قريب جدا لمبدء Open Closed Principle في مبادئ ال Solid لكتابة كود منظم
تخيّل أنك تتعامل مع مصادر بيانات مختلفة؛ أحيانًا تُعيد البيانات بصيغة JSON وأحيانًا بصيغة XML. هنا يأتي دور Adapter Design Pattern لتوحيد طريقة التعامل مع هذه البيانات دون التأثير على الكود الأساسي.
يُستخدم هذا النمط بشكل مثالي عندما:
(يكون لديك مكتبة أو كود موجود ترغب في إعادة استخدامه، لكن واجهته غير متوافقة مع النظام الحالي).
شاهد أيضًا
مقالات ذات صلة
حزمة Flutter للبحث داخل النص تدعم اللغه العربيه – scroll highlight text

ماهي مكتبة scroll_highlight_text ؟تتيح لك هذه الحزمة الجديدة الخاصة بفلتر إبراز النصوص والتمرير خلالها، وذلك…

كيفيه تفعيل ميزه AutoFill في مشروعك Flutter

كيفيه تفعيل ميزه AutoFill في مشروعك Flutterتعد ميزة Auto Fill واحدة من أهم الميزات التي…

التعرف على اصدار التطبيق واظهار رسالة بتحديث التطبيق اذا توفرت نسخه احدث في Flutter

التعرف على اصدار التطبيق واظهار رسالة بتحديث التطبيق اذا توفرت نسخه احدث في Flutter في…

🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع