Files

title, shortTitle, category, language, tag
title shortTitle category language tag
Dependency Injection Dependency Injection Creational ar
Decoupling

الغرض

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

الشرح

مثال من العالم الحقيقي

يحب الساحر العجوز ملء غليونه والتدخين من وقت لآخر. ومع ذلك، لا يريد أن يعتمد على علامة تجارية واحدة من التبغ، بل يحب أن يتمكن من الاستمتاع بها جميعاً بشكل قابل للتبادل.

بكلمات بسيطة

حقن التبعيات يفصل إنشاء التبعيات للعميل عن سلوكه الخاص.

تقول ويكيبيديا

في هندسة البرمجيات، حقن التبعيات هو تقنية يحصل فيها كائن على كائنات أخرى يعتمد عليها. تُسمى هذه الكائنات الأخرى بالتبعيات.

مثال برمجي

لنقم أولاً بتقديم واجهة التبغ Tobacco والعلامات التجارية المحددة.

@Slf4j
public abstract class Tobacco {

  public void smoke(Wizard wizard) {
    LOGGER.info("{} smoking {}", wizard.getClass().getSimpleName(),
        this.getClass().getSimpleName());
  }
}

public class SecondBreakfastTobacco extends Tobacco {
}

public class RivendellTobacco extends Tobacco {
}

public class OldTobyTobacco extends Tobacco {
}

التالي هو واجهة Wizard وتنفيذها.

public interface Wizard {

  void smoke();
}

public class AdvancedWizard implements Wizard {

  private final Tobacco tobacco;

  public AdvancedWizard(Tobacco tobacco) {
    this.tobacco = tobacco;
  }

  @Override
  public void smoke() {
    tobacco.smoke(this);
  }
}

وأخيراً يمكننا أن نثبت مدى سهولة إعطاء التبغ Tobacco لأي علامة تجارية قديمة للساحر.

    var advancedWizard = new AdvancedWizard(new SecondBreakfastTobacco());
    advancedWizard.smoke();

Class Diagram

alt text

Applicability

Use the Dependency Injection pattern when:

  • You need to eliminate the knowledge of the concrete implementation of the object.
  • To allow unit testing of classes in isolation using mock objects or stubs.

Credits