假如有一个 船(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
转载来源:知乎