需求:把一个User类给添加到数据库中
对于此功能的不同实现方法:
最原始的方式:
写一个User类,在User类的main方法里面首先new一个User;对象出来,
之后把他给写入到数据库
第一次改进之后:
写一个User类,一个Test类,在Test类中的main方法里面去new一个User
并且把它存入到相应的数据库中.
第二次改进之后:
写一个User类,一个Test类,一个UserService类,其中UserService类
实现了对User类的所需要的操作,而Test类只需要直接的调用UserService
类中的方法去实现它需要实现的功能即可.
第三次改进之后:
写一个User类,一个Test类,一个UserService类,一个UserDAO类,User
其中UserDAO的作用是提供对User存入数据库提供实现方法.
第四次改进之后:
写一个User类,一个Test类,一个UserService类,一个UserDAO类,多个
UserDAOImpls的实现类,这个时候UserDAO就修改为接口了,而UserDAOImpls
才是真正的提供User数据与数据库打交道的那个类,这个时候呢灵活性就体
现出来了,灵活性体现在UserService对于数据库的操作上面的灵活性,简单
性.
对于第三次的改进而言,只是有了对于数据库的操作的实现,但是如果换了数
据库的话,就需要修改实现了,换句话就是需要重新的去修改UserDAO里面的代
码了,可是如果把UserDAO写成接口的话,那就不一样了,因为是接口,所以可以
生成多个接口的实现类,可以针对不同的数据库提供不同的实现,这个时候在
使用的是接口来new一个实现类
UserDAO userdao = new UserDAOmySqlImpl();
而且在换了数
据库实现之后并不用去修改具体的实现类的代码,而只是需要修改new的后半
部分就可以了,比如这个时候需要使用Oracle数据库来实现了,这个时候就
这样
UserDAO userdao = new UserDAOOracleImpl();
因为它们都实现了相同的接口,所以里面所拥有的方法都是一样的,这个时候
其他的代码都不要修改了,只需要修改这一处的代码即可.
第五次改进之后:
问题:大部分的情况下需要存入数据库的并不是单一的一个类,或者几个类,而
是好多的类,这个时候怎么办呢?
因为需要对这些DAO进行统一的管理,这个时候就不能只是用哪个然后去new哪个
了还是有一些的麻烦,因此可以使用配置文件来读取自己需要new的类,这样就可
以更加灵活的来控制程序了,根据配置文件中的配置参数去new出来各种不同的
对象用来实现它们的功能.
第六次改进之后:
这次的改进是对Service这个类进行抽象,把它给抽象为接口,然后对Service提
供不同的实现,这个Service之所以要进行抽象在于对他的不同需求,比如有的
Service类需要提供权限的检查,有的不需要,这个时候就有对灵活性的要求了,
既然有了就可以根据具体的情况去处理这个请求,自然需要使用抽象来实现这个
灵活性的需求了,比如在配置文件中配置好Service的需求,需要检查,那么在new
的时候就可以根据读取到的具体的内容去new它们了.
第七次改进之后:
这一次的改进是对类的一个实例化处理,就是根据xml的配置来读取具体的内容,
根据内容生成具体的对象,就是BeanFactory.
到了第六次改进之后就差不多了,这个时候对于User的处理就只需要对外
提供UserService的接口就行了.基本上就满足了对灵活性的要求了.
其中UserDAO与UserService的区别在于,UserDAO只是负责User类与数据库
之间打交道,UserService虽然它里面也负责User跟数据库打交道,但是它
向外公开的是业务逻辑而UserDAO则是封装了具体的User类是怎么存入到
数据库中的,除此之外UserService还要负责其他的一些业务逻辑,比如对
用户权限的验证等等.
这个也叫做面向抽象编程,它的灵活性得到了大大的提高.