在写这篇文章之前,首先说点题外话,其实自己本来不想学这么多编程语言的,原本想把精通一门作为目标,但是由于工作的原因,现在又不得不接触了java Spring MVC框架,开始学Spring的时候,对依赖注入与控制反转产生了一些疑惑,通过了查阅资料和编程实践,将自己的一些学习心得总结如下:
在面向对象编程的时候,我们有时候会碰到这样的问题,高层模块的程序实现调用底层模块,当底层模块的对象类型改变时我们不得不改变高层模块的程序源代码,例如:
1 public class WhereToGo{2 private Male MrKing = new Male();3 public void tellMe(){4 System.out.println("I should go to man's room");5 }6 }
如果是一个Female类型的对象(女人),那么就得改变程序的源代码,程序的控制权实际上在Male和Female类的手上。
针对上述的情况,我们做如下的改变:
先定义一个接口:
1 public interface Gender{2 public void tell();3 }
在接口中声明一个方法,声明了这个方法后就可以供接口的不同实现来 重写这个方法,如下:
1 public Male implements Gender{ 2 public void tell(){ 3 System.out.println("I should go to man's room"); 4 } 5 } 6 7 public Female implements Gender{ 8 public void tell(){ 9 System.out.println("I should go to woman's room");10 }11 }
重新实现了底层的Male和Female类,其核心是通过接口对方法进行 重写,然后我们重写WhereToGo类:
1 public class WhereToGo{2 private Gender g1;3 public void setGender(Gender g2){4 this.g1 = g2;5 }6 public void tellMe(){7 g1.tell();8 }9 }
这个类主要通过接口将tellMe方法具体定义为Male.tell()或Female.tell(),控制权转移到了接口Gender。
所以就实现了控制权由底层向抽象的转移。
抽象:比如要描述一个人,人由很多种属性组成,我们用其中的两种:性别、年龄来描述这个人,并定义一个类:
1 class person{2 private name;3 private age;4 }
那么这个类person就是对人的一个抽象,简言之,类和接口就是抽象,对象是实现。
具体实现如下:
1 WhereToGo where = new WhereToGo();2 where.setGender(new Female);3 where.tellMe();
有兴趣的可以自己试试。