学到Spring老师一定会讲一句话:IOC能够降低耦合性。可是为什么会降低耦合性,许多老师就讲不清了,下面我们通过举一些栗子来说明为什么IOC能够降低耦合性。
第一层-传统方式
通常我们写java程序都是通过实例化来获取对象,代码如下:
Dog dog = new Dog();
dog.woof();
如果我们想要将Dog换成Cat,就需要在所有的程序中将Dog dog = new Dog()换成Cat cat = new Cat().除此之外,cat对象没有woof方法,而是具有bark方法,那么所有程序基本上等于白写了,你需要在所有程序中找到实例化dog对象的语句,然后将其替换成实例化cat对象,然后还要找到使用了dog对象的地方,删除woof方法的调用.也就1000多处声明,1000多处调用,今天和明天加加班就能搞完!!!加油!!!奥里给!!!
第二层-接口
有个小天才说,我们约定好一些公用的方法,大家都去实现它,不就可以任意切换了吗?对这就是接口.
代码如下:
Animal animal = new Dog()
animal.bark();
好了现在我想把Dog换成Cat,只需要将所有的new Dog()换成new Cat()就行了,只需要在所有的程序中寻找Dog就好.也就如果你有1000个类,只需要今晚加加班就能搞定!!!加油!!!奥里给!!!
接口能够一定程度上降低代码的耦合度,接口就像一个插头面板,面板后面可以接火线也可以接零线.正是这个面板,让我们可以在符合标准的线之间任意切换.
第三层-工厂模式
又有一个小天才相出了一个绝妙的主意,我去构造一个既能生产Dog对象又能生产Cat对象的类不就更爽歪歪?
代码如下:
class AnimalFactory{
AnimalFactory(){}
public static Animal getInstance(String type){
Animal result = null;
if("dog".equals(type)){
result = new Dog();
}
if("cat".equals(type)){
result = new Cat();
}
return result;
}
}
Animal animal = AnimalFactory.getInstance("dog");
animal.bark();
这种方法把创建对象的过程交给了一个专业的类(Factory),我只需要告诉他我需要什么(参数),他就会返回给我正确的对象.但是他并没有解决我的声明语句七零八落的散落在程序中,现在我只能全文搜索一下,把所有的参数从dog换成cat.
但有了替换程序,我只需要裁定一下是否替换,两个小时应该可以搞定,今晚晚下班一会应该可以搞定!!!
第四层-反射
后来又有个大天才,他想到一个更绝妙的主意.我在写程序的时候不告诉工厂我需要什么,等到运行的时候我再告诉工厂我需要什么,你再给我生产出来不就可以了吗?
Animal animal = AnimalFactory.getInstance(我想要的你去config中读取);
animal.bark();
我想要的 = dog
好了,工厂要生产什么全部都写在了一个文件中,我只需要利用反射技术,在运行时再去读取要工厂生产的东西即可.这样如果我不希望生产dog了,只需要修改配置文件中dog->cat即可,只修改一处就行了.只需30秒,今晚不加班!!!
就这样我们通过四个层次降低了代码之间的耦合度了吗?