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