依赖注入
依赖注入指的就是类A依赖于类B,通过外部注入的方式来实现,而不是通过自身去实现。
这样做的好处就是可以使得代码之间更加的解耦。
举个例子,船(ship)包含有船桨(oar),以下为高耦合的写法,
public class Oar { //船桨 public Oar(){ } }
public class Ship { private Oar oar;//船桨 public Ship(){ oar = new Oar();//在类中自己实现船桨 } }
这样写的坏处就是,ship和oar耦合度太高,将来如果oar发生变化,比如需要指定oar的长度
public class Oar { int length; public Oar(int length){ this.length = length; } }
那么ship的代码也需要进行修改
public class Ship { private Oar oar; public Ship(int length){//指定船桨的长度 oar = new Oar(length); } }
使用依赖注入的方法对上面的代码进行修改,通常有3中方法,
1.构造函数传递依赖
public class Ship { private Oar oar; public Ship(Oar oar){ this.oar = oar;//构造函数传递 } }
2.Setter函数传递
public class Ship { private Oar oar; public Ship(){ } public void setOar(Oar oar){//setter函数传递 this.oar = oar; } }
3.接口声明传递
将船和船桨抽象成一个接口
public interface OarI {//浆接口 }
public interface ShipI {//船接口 public void setOar(OarI oar);//接口依赖传递 }
船和浆分别继承接口
public class Oar implements OarI{ public Oar(){ } }
public class Ship implements ShipI{ private OarI oar; public Ship(){ } @Override public void setOar(OarI oar) { this.oar = oar; } }
经过修改之后船和船桨更加解耦,特别是第三种接口传递依赖,当需求发生变化时,修改的地方会比较少,结构也很清晰。