fw
DAO模式的目的:低级别的数据访问逻辑与高级别的业务逻辑分离,说白了就是对数据库的每1次操作(实现可以有多种实现,我们一般用JDBC)都封装到一个名为XXDAO的类的方法中。外部(一般是业务类)调用时只需要传入相应的参数,不会出现操作数据库的代码,不会出现SQL语句,甚至可以说调用者可以完全不懂数据库,只需要按照DAO实现者所提供的接口去调用相应的方法,而不需要关心底层对数据库操作的实现。DAO即为data access object 数据访问对象,封装并对外提供操作数据库的基础服务
1.初级DAO模式(每个人都必须掌握):在xxDAO类中封装对数据库操作的方法,一般来说一张表对应一个xxDAO类,外部操作数据库只需要调用封装后的方法
例如:UserDAO dao = new UserDAO();
dao.save()
2.高级DAO实现模式1(尽量掌握,用得较多)
DAO工厂模式:多个XXDAO实现同一个接口或者继承同一个基类,编写一个工厂类通过工厂模式(简单工厂模式或利用反射动态加载均可)获得接口或基类对象,内部实际上封装返回的是具体的XXDAO类的对象。简单的说即是在1的基础上将创建具体的XXDAO对象的方式由new变为工厂模式实现
例如:UserDAO dao = ate(...);
dao.save()
3.高级DAO实现模式2(理解即可)
DAO抽象工厂模式:在2的基础上,现在可能在一个系统中需要使用DAO模式对不同的数据库进行操作,即某个业务方法需要访问ORACLE数据库,而某个方法需要访问SQLSERVER。因此,不能简单地直接修改将连接工具类里的连接字符串或属性文件,而是在2的基础单例模式的几种实现方式上做出修改,在DAO工厂类的上面再加上一个抽象工厂类,而针对每种数据库操作的DAO都会有一个工厂类来继承这个抽象工厂类,通过抽象工厂类获得具体的针对某种数据库的工厂类,然后再通过工厂模式获得具体的xxDAO对象。以此来屏蔽对不同数据库的访问。
例如:
public abstract class DAOFactory{}
public class SqlServerDAOFactory extends DAOFactory{}
SqlServerDAOFactory sqlFactory = Factory(..);
UserDAO dao = ate(...);
dao.save()
当然,对于2和3,在获得工厂类对象的时候,我们可以添加一个静态方法获得工厂类对象,即使用单例模式提高性能
例如 UserDAO dao = Factory().create(...)
总的来说,可能一句很简单的很直接的 new UserDAO()的实现却非要用设计模式转若干个弯去实现它,
这似乎显的很多余。但是采用一些成熟的设计模式,会使程序更加的健壮,松耦合以及好维护和扩展. 同时,对于学习framework时研究源代码也有很大的帮助。
附注:
1.为什么要分层?
一个软件,一个上线的系统,无论初始的功能,界面是怎样的,随着时间的推移,必定会因为市场或客户的需求不断的扩展和伸缩。那么,是否具有良好的可扩展性和可伸缩性就成为了衡量软件生命周期的标准。很多失败的项目,并不是指功能没有实现,没有做出来,而是指的在后期陷入了需求变更的泥潭,系统臃肿不堪,牵一发而动全身,拆东墙补西墙的现象比比皆是。计划总是没有变化快,为了最大限度的降低需求变更的风险,必须在设计阶段考虑周全。
分层是一种很好的思想,它使得多人并行开发变得更加容易。从表面上看,它使得整个系统的架构变得更大了,出现了更多的接口,类(B/S架构),也就是说在系统架构设计阶段我们所需要做的事情变多了。但是,随之而来的好处是显而易见的,而在架构打好之后,我们所做的仅仅是只需要象个建筑工人一样往里面填代码。
一个成熟的架构体系(通常分为大的3层:表现层,业务层,持久层),往往能够达到层与层之间耦合度达到最低,实现松耦合,高类聚的效果。也就是说层与层之间互不干扰,几乎完全独立,每个层独立分出来都能被当成是一个组件而重复使用。举个例子:严格按照规范进行分层的项目里,我可以让一个人只负责持久层开发,开发完成后写上注释,把类和接口打成一个JAR包。接着我让另一个人开发业务层,他要做的只是导入JAR包,打开注释文档,看着注释决定调用DAO里的哪个方法或者组装几个DAO方法再加上一些逻辑代码去完成一个业务的开发,他甚至可以不会HQL,SQL,不懂数据库都可以。
比如说吃东西,如果喝粥喝习惯了,拿来馒头就喝不下去了,这时候就必须引入一个中间的层,来判断一下“方法”再执行“吃”。
这也就是分层的最初目的。
比如病人吃不了东西,要通过注射葡萄糖来补充能量,那就又要引入“吃”之前的层了。
再举例:19世纪火车刚发明的时候,只有1节车厢,随着载人增多,车厢会加长,但是过长的车厢在转弯的时候会有困难,因此我们的火车有多节车厢。车厢载人的由少到多代表了
一个项目从开始到后期功能上的扩展,转弯意味着需求的变更。而我们现在的火车,通通都是一被造出来就拥有很多节车厢的,相当于我们的设计阶段,而到了某一站后,乘客会按照车票上各自的车厢,相当于架构打好后我们往里面填代码。
2.单例和工厂的作用?
单例:保证一个类只有一个实例 在特定情况下能够提高性能 注意你们项目里用的叫做惰性创建,需要用时才创建。而方法前加上synchronized是为了同步,增加安全性,在多线程环境下(如WEB应用)避免同一时间内多个线程调用这个方法从而导致多个实例产生。
工厂:避免了在创建类的对象时都通过我们自己手动new的方式创建 而是将程序分为了工厂和客户,需要创建某个类的对象时由客户象工厂提出需求由工厂来创建,当然实际上工厂和客户都是我们自己。实际上就是将对一个类的创建和使用分离,我们使用者只管使用,而创建的工作交给工厂,即向工厂要一个对象,然后使用,而不是由我们自己来创建对象
我们做JAVA程序好比做菜,而设计模式好比菜谱,没有菜谱的话你甚至连该买什么原料都
不知道,而你们以后要学的框架,就好比一些高级厨师按照菜谱做出来的熟菜,凉菜。这时候我们不用自己做了,而只需要买回家拼起来蘸点调料就能吃。
3.什么是MVC?
MVC是一种模式,也是最简单,最基础的分层架构
V:view 视图
C: contrllor 控制器
M: model 模型(在我们所说的3层结构或以后要学习的j2ee体系中中,MODEL通常就是业务层和持久层的结合)
4.为什么使用接口?
面向接口编程是面向对象编程的核心,接口将设计和实现相分离,将类与类之间解耦。对外(调用者)隐藏了实现(而通常调用者也不需要关心实现)。“everything depends on everything”(具体依赖于具体),通过使用接口,我们可以避免这样的情况发生。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论