天上飞的理念,必有落地的实现!
软件系统中一个类中用到了另一个类就产生了依赖,依赖是不可避免的。但我们尽量要降低依赖,以达到高类聚、低耦合的系统架构。低依赖软件系统架构的思想为——依赖倒置,具体可解读为两点:
1.上层模块尽量不要依赖于具体的下层模块,而是应该尽量让它们共同依赖于一个抽象。
2.抽象尽量不要依赖于具体对象,而是应该具体对象依赖于抽象。
以下为一个代码示例如何避免依赖:
要求:设计一个zoo类,引入animal后就输出该animal的信息。
(1)设计一个公共接口animal,该接口只有一个info方法用来输出信息。
public interface animal{
void info();
}
(2)设计一个狗类
public class Dog implemets animal{
@Override
public void info(){
System.out.println("this is a dog!");
}
}
(3)设计一个猫类
public class Cat implemets animal{
@Override
public void info(){
System.out.println("this is a cat!");
}
}
(4)设计一个动物园类,依赖一个animal类,add方法来调用animal的info方法。
public class Zoo{
private animal aml;
public animal getaml(){
return aml;
}
public void setaml(animal aml){
this.aml=aml;
}
public void add(){
this.mal.info();
}
}
(5)测试类
public class Test{
public stataic void main(String[] args){
animal a=new Dog();
a.setaml(a);
a.add();
}
}
输出结果为:
this is a dog!
如果要add其他动物,只用修改测试类中标红的一行即可。
仔细思考可以发现,如果直接依赖一个具体类,如果要切换被依赖的模块要修改很多地方,这里至少要修改private animal以及new这两个位置,这只是一个简单的场景,如果更复杂的系统中修改的地方至少是依赖接口方式的两倍还多。
通过梳理逻辑,我们发现依赖倒置能降低依赖,其实就是将所有具体类交给一个接口管理。将它们归到接口这个类型下面,需要具体实例的时候去绑定。仔细想想,这是不是就是spring的J2EE应用里面常用的分层逻辑?controller,service+impl,mapper?