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 简单案例的更多相关文章

  1. [Design Pattern] Facde Pattern 简单案例

    Facade Pattern, 即外观模式,用于隐藏复杂的系统内部逻辑,提供简洁的接口给客户端调用,属于结构类的设计模式.我会将其名字理解为,门户模式. 下面是 Facade Pattern 的一个简 ...

  2. [Design Pattern] Front Controller Pattern 简单案例

    Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...

  3. [Design Pattern] Observer Pattern 简单案例

    Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...

  4. [Design Pattern] Mediator Pattern 简单案例

    Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例 ...

  5. [Design Pattern] Iterator Pattern 简单案例

    Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单 ...

  6. [Design Pattern] Command Pattern 简单案例

    Command Pattern, 即命令模式,把一个命令包裹在一个对象里面,将命令对象传递给命令的执行方,属于行为类的设计模式 下面是命令模式的一个简单案例. Stock 代表被操作的对象.Order ...

  7. [Design Pattern] Proxy Pattern 简单案例

    Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage ...

  8. [Design Pattern] Flywight Pattern 简单案例

    Flywight Pattern, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已 ...

  9. [Design Pattern] Filter Pattern 简单案例

    Filter Pattern,即过滤模式,通过不同的过滤标准,或者低耦合将过滤标准组合在一起,对一组对象进行过滤,属于结构类的设计模式. 下面是一个过滤模式的简单案例. Criteria 定义过滤接口 ...

随机推荐

  1. svcutil 生成代理类时的问题

    如果有这个的xsd, group内嵌choice的结构: <xs:complexType name="CreateType">        <xs:sequen ...

  2. Linux shell入门基础(五)

    五.bash运算及启动脚本 01.使用bash的命令历史 #history …… #set(显示所有的变量) | grep HIS HISTFILE=/root/.bash_history HISTF ...

  3. EXCEL表格常用函数使用的难点

    1.  INDIRECT(ref_text,逻辑值) 返回由文本字符串指定的引用.此函数立即对引用进行计算,并显示其内容.ref_text,文本引用说明, (1) A1-样式的引用(逻辑值,T,缺省) ...

  4. 网页嵌入百度地图和使用百度地图api自定义地图的详细步骤

    在网页中插入百度地图 如果想在自己的网页上面加入百度地图的话,可以用百度地图的api.具体使用方法如下: 第一步:进入百度创建地图的网站http://api.map.baidu.com/lbsapi/ ...

  5. (多对象)Json转换成List

    写的不好,请大家见谅. 1.Json 格式{"packages":[{“type”:”aaa”}],"zone_packages":[{"ticket ...

  6. 关于电脑开机不出现桌面即不启动explorer.exe桌面程序--------正解

    针对这个问题,一开始的思路是,把自己写的界面小程序(Win.exe)放在Windows启动文件夹中, 效果到是界面程序自启动了,但是还是先出现的桌面,然后才的启动的界面程序(Win.exe),并不是我 ...

  7. css 圆角效果

    http://intacto10years.com/index_start.php<div style="width:800px; height:1300px;">&l ...

  8. Mysql软删除

    所谓软删除(Soft Deleting),即在删除数据表中的数据时,并不直接将其从数据表中删除,而是将其标志为删除,即在每张表中设置一个删除字段(如:IsDeleted)等,默认情况下其值为0,及未删 ...

  9. delphi服务程序(service)的调试方法

    方法一: 1.调试delphi 写的服务程序,有这么一个办法.原来每次都是用attach to process方法,很麻烦.并且按照服务线程的执行线路,可能会停不到想要的断点.笨办法是,在proced ...

  10. 利用GDB在远程开发机进行调试

    由于一些环境的制约,很多同学都可能需要在开发机上进行调试,但由于开发机资源的限制,在开发机上直接进行本地的GDB环境配置就成了难题,这个时候其实我们可以利用GDB中自带的gdbserver工具就可以进 ...