如何理解依赖注入

假如有一个 船(Chuan)类 ,成员变量中肯定需要一个 桨(Jiang) 类,

class Chuan{
  Jiang j = new Jiang() ;
}

如果船要干什么事,肯定需要桨的参与。所以是十分 “依赖”桨;

来新需求,桨需要统一长度为10米。需要重构:这时候我们需要控制桨的长度为10在构造方法中。我们需要这么写;

class Chuan{
  Jiang j = new Jiang(10) ;
}

来了,这一个改动同时需要修改桨的类即加入长度属性,又需要修改船其中的new Jiang()代码传入长度(修改两处)。这时候就设计者就思考,为什么我们加入一个特性需要更改两个类中代码(这也就是耦合度高)!
所以我们要解耦要依赖注入;

常用解耦方式:

  • 构造方法注入

如下:我重构代码的时候再也不用管依赖的桨长还是短,宽颜色都不管!因为船构造方法依赖了桨。任你桨怎么设计,我用的时候传一个桨进来即可。(下层依赖上层,用的时候传入,而不是针对下层去修改)

class Chuan{
  Jiang j ;
  public Chuan(Jiang j){
       this.j = j;
  };
}
  • 工厂模式注入

新需求如下:桨的生产商觉得不能让你全国各地的船用之前都需要制造一个桨,天津船需要时候天津当地new 一个桨,北京需要 北京当地new一个桨,造成了使用时多处代码依赖桨,这样之后再修改桨的规范就要各处去修改,太麻烦了且容易错误不统一。

所以搞一个全国工厂,让桨的生产过程即new的过程就在这一个类中,船就只关注Factory类中方法便可。(核心业务逻辑需要依赖的类,该类实例化交给第三方类来实现注入。)

工厂模式 新增个Factory 工厂类去注入; 工厂类如下

class Factory {
   /**
    * 通过msg来确定你要什么长度颜色大小。工厂出一套规范。之后约束拓展在此类就可以进行
    **/
    public Jiang getJiang(String msg){
     if(msg="10"){
       return new Jiang(10) 
     }else if(msg="red"){
       return new Jiang("red") 
     };
    };
   
}

船的代码变为

class Chuan {
    Jiang j ;
     void run(){
      Factory h = new Factory();
      j=h.getJiang(“red“); //得到了红色的桨
      j=h.getJiang(10); //得到长度10的桨  
   };
    
}
  • 框架注入(本质还是工厂设计模式的具体实现)

本质也是第三方依赖注入,但是这个第三方可以脱离类。将对象依赖映射信息存储在容器一般为.xml 或者特定的对象中,并实现动态的注入。需要用的时候直接拿就是的。

最后本人个人理解:

为什么要有依赖注入(一种设计代码模式),因为我们要控制反转(设计代码的思路)。为什么控制反转。因为我们软件设计需要符合软件设计原则依赖倒置(设计代码原则),单一职责原则,开闭原则。

归根到底都是,寻找业务中容易变化的点,寻找解耦的点, 让其更加可控,让程序员改代码的时候容易些,同时对系统的影响小。

作者:93号选手

链接:https://www.zhihu.com/question/32108444/answer/121881566

转载来源:知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值