2013年12月15日 星期日

OOAD原則 (七) Dependency Injection (DIP依賴倒置原則 - 續2)

相依性注入 (DI) 是實踐DIP的方法
  • Constructor Injection
  • Property Injection
  • Interface Injection
以下要直接介紹這三個方法



Constructor Injection

class Behavior
{
 public void Run()
 {
  System.out.println("Run");
 }
}
public class ConstructorInjection {

 /**
  * @param args
  */
 
 private Behavior behavior;
 public ConstructorInjection(Behavior _be)
 {
  behavior = _be;
 }
 public void Execute()
 {
  behavior.Run();
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  ConstructorInjection injection = new ConstructorInjection(new Behavior());
  injection.Execute();
 }
}

上面的方法是將物件在class 初始化的時候將所需要的Behavior直接注入,來避免高偶合(繼承)的問



Property Injection

class TomRun
{
 public void Run()
 {
  System.out.println("Run");
 }
}
public class PropertyInjection {

 /**
  * @param args
  */
 private TomRun behavior;
 public TomRun GetTomRun()
 {
  return behavior;
 }
 public void setTomRun(TomRun _be)
 {
  behavior = _be;
 }
 public void Execute()
 {
  behavior.Run();
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  PropertyInjection injection = new PropertyInjection();
  injection.setTomRun(new TomRun());
  injection.Execute();
 }

}

上面的方法是利用getter and setter 讓我們將所需要的 TomRun注入  來避免高耦合(繼承)的情形


Interface Injection

interface RunBehavior
{
 void Run();
}
public class interfaceInjection implements RunBehavior {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  RunBehavior behavior = new interfaceInjection();
  behavior.Run();
 }

 @Override
 public void Run() {
  // TODO Auto-generated method stub
  System.out.println("Run");
 }

}

上面的方法是利用 interface 讓class implements 該interface 並實作之
利用interface 注入來避免高耦合(繼承)的問題


利用這些方法,我們可以避免使用繼承,使用相依注入,降低耦合,
當然,第一個例子和第二個例子更好的寫法是使用interface 然後注入使用的參數是interface而不是class  這樣又可以呼應到DIP的要點



依賴抽象類別,不要依賴具象類別。



利用抽象來當作class之間溝通的方式,這樣寫出來的程式耦合度會更低,會更好maintain

沒有留言:

張貼留言