Data Access Object Pattern, or DAO Pattern, 即 DAO 模式,用于分离底层的数据访问接口,已经上层的业务逻辑。
下面是 Dao 模式的一个简单的案例。
Student 是纯 Java Beans 类。StudentDao 定义 Dao 的访问接口,StudentDaoImpl 实现该接口。 DaoPatternDemo 演示 Dao 模式
代码实现
Student ,是纯数据对象
public class Student implements Cloneable { private String name;
private int rollNo; public Student(String name, int rollNo){
this.name = name;
this.rollNo = rollNo;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getRollNo() {
return rollNo;
} public String toString(){
return "[name : " + name + ", rollNo : " + rollNo + "]";
} public Object clone() {
Student newStud = new Student(this.name, this.rollNo);
return newStud;
}
}
StudentDao 定义 Dao 接口
import java.util.List; public interface StudentDao { public List<Student> getAllStudents(); public void updateStudent(Student student); public void deleteStudent(Student student); public void addStudent(Student student); }
StudentDaoImpl 是 Dao 的具体类,实现 Dao 接口
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map; public class StudentDaoImpl implements StudentDao { private Map<Integer, Student> no_stud; public StudentDaoImpl(){
no_stud = new Hashtable<Integer, Student>();
Student studa = new Student("aa", 0);
Student studb = new Student("bb", 1);
no_stud.put(studa.getRollNo(), studa);
no_stud.put(studb.getRollNo(), studb);
} @Override
public List<Student> getAllStudents() {
List<Student> students = new LinkedList<>(no_stud.values());
return students;
} @Override
public void updateStudent(Student student) {
no_stud.get(student.getRollNo()).setName(student.getName());
} @Override
public void deleteStudent(Student student) {
no_stud.remove(student.getRollNo());
} @Override
public void addStudent(Student student) {
if (no_stud.containsKey(student.getRollNo())){
System.out.println(" duplicate student No. cannot add ");
}
else{
no_stud.put(student.getRollNo(), student);
}
} public Student getFirstStudentCopy(){
Student student = (Student)no_stud.get(0).clone();
return student;
}
}
演示 Dao 模式。注,代码中 StudentDaoImpl::getFirstStudentCopy ,是为了演示 StudentDaoImpl::updateStudent 而出现的 ,但并未出现在 UML 图中。
public class DaoPatternDemo { public static void main(){ StudentDaoImpl studentDaoImpl = new StudentDaoImpl();
System.out.println(studentDaoImpl.getAllStudents()); Student student = studentDaoImpl.getFirstStudentCopy();
student.setName("sss");
System.out.println(studentDaoImpl.getAllStudents()); studentDaoImpl.updateStudent(student);
System.out.println(studentDaoImpl.getAllStudents());
}
}
参考资料
Data Access Object Pattern, TutorialsPoint
[Design Pattern] DAO Pattern 简单案例的更多相关文章
-
[Design Pattern] Facde Pattern 简单案例
Facade Pattern, 即外观模式,用于隐藏复杂的系统内部逻辑,提供简洁的接口给客户端调用,属于结构类的设计模式.我会将其名字理解为,门户模式. 下面是 Facade Pattern 的一个简 ...
-
[Design Pattern] Front Controller Pattern 简单案例
Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...
-
[Design Pattern] Observer Pattern 简单案例
Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...
-
[Design Pattern] Mediator Pattern 简单案例
Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例 ...
-
[Design Pattern] Iterator Pattern 简单案例
Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单 ...
-
[Design Pattern] Command Pattern 简单案例
Command Pattern, 即命令模式,把一个命令包裹在一个对象里面,将命令对象传递给命令的执行方,属于行为类的设计模式 下面是命令模式的一个简单案例. Stock 代表被操作的对象.Order ...
-
[Design Pattern] Proxy Pattern 简单案例
Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage ...
-
[Design Pattern] Flywight Pattern 简单案例
Flywight Pattern, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已 ...
-
[Design Pattern] Filter Pattern 简单案例
Filter Pattern,即过滤模式,通过不同的过滤标准,或者低耦合将过滤标准组合在一起,对一组对象进行过滤,属于结构类的设计模式. 下面是一个过滤模式的简单案例. Criteria 定义过滤接口 ...
随机推荐
-
跨集群 distcp命令
两个集群之间做数据同步,而且两个集群之间的版本不一致,这个时候使用的是hftp协议或者webhdfs协议! 如果试图在两个运行着不同HDFS版本的集群上使用distcp命令来复制数据并使用hdfs协议 ...
-
Fresco 源码分析(三) Fresco服务端处理(2) Producer具体实现的内容
我们以mProducerFactory.newNetworkFetchProducer()为例,因为这些创建新的producer的方式类似,区别在于是否有包装的处理器,即如果当前处理器中没有正在处理的 ...
-
maven和jdk版本不匹配
解决方法:http://blog.csdn.net/mafan121/article/details/51944346
-
Yii2 国际化的问题 zh-CN
代码增加位置: 在项目文件目录的config->main.php 的 return 内增加以下内容,并在项目目录中新建messages 内设置 en-US 和zh-CN 文件夹.zh-CN文件夹 ...
-
Sina微博爬取@pyspider
这是一篇不应该写的文章,都写了,针对特定“方式”的爬虫也就没法爬了. 1.模拟登录的一些文章: 解析新浪微博的登录过程(2013-12-23): http://www.cnblogs.com/houk ...
-
[20180316]为什么不使用INDEX FULL SCAN (MIN/MAX).txt
[20180316]为什么不使用INDEX FULL SCAN (MIN/MAX).txt --//链接:http://www.itpub.net/thread-2100456-1-1.html.自己 ...
-
c输出格式
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { //取整 printf( ...
-
转:Java 集合详解
原文地址:https://www.cnblogs.com/ysocean/p/6555373.html 一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发 ...
-
Django使用jsonp和cors解决跨域请求问题
1.使用jsonp的方式解决跨域请求的问题 我启动两个django项目,然后使用的端口不一样,在项目1中通过ajax发请求给项目2,然后接受项目2发送过来的数据 先看项目1的ajax的代码 $(&qu ...
-
ThinkPHP V5.0 正式版发布
ThinkPHP5.0版本是一个颠覆和重构版本,官方团队历时十月,倾注了大量的时间和精力,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持compose ...