设计模式【数据访问对象模式DataAccessObjectPattern】

数据访问对象模式

数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。

  • 数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。
  • 数据访问对象实体类(Data Access Object concrete class) - 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。
  • 模型对象/数值对象(Model Object/Value Object) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。

实现

我们将创建一个作为模型对象或数值对象的 Student 对象。StudentDao 是数据访问对象接口。StudentDaoImpl 是实现了数据访问对象接口的实体类。DaoPatternDemo,我们的演示类使用 StudentDao 来演示数据访问对象模式的用法。

数据访问对象模式的 UML 图

步骤 1-创建数值对象

Student.cs

namespace DataAccessObjectPattern
{
    class Student
    {
        string name;
        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 void setRollNo(int rollNo)
        {
            this.rollNo = rollNo;
        }
    }
}

步骤 2-创建数据访问对象接口

StudentDao.cs

using System.Collections.Generic;
namespace DataAccessObjectPattern
{
    interface StudentDao
    {
        List<Student> getAllStudents();
        Student getStudent(int rollNo);
        void updateStudent(Student student);
        void deleteStudent(Student student);
    }
}

步骤 3-创建实现接口的实体类

StudentDaoImpl.cs

using System;
using System.Collections.Generic;
namespace DataAccessObjectPattern
{
    class StudentDaoImpl : StudentDao
    {
        //列表是当做一个数据库
        List<Student> students;

        public StudentDaoImpl()
        {
            students = new List<Student>();
            Student student1 = new Student("Robert", 0);
            Student student2 = new Student("John", 1);
            students.Add(student1);
            students.Add(student2);
        }

        public List<Student> getAllStudents()
        {
            return students;
        }

        public Student getStudent(int rollNo)
        {
            foreach (var student in students)
            {
                if (student.getRollNo() == rollNo)
                    return student;
            }
            return null;
        }

        public void updateStudent(Student student)
        {
            Student target = getStudent(student.getRollNo());
            if (target == null)
                return;
            target.setName(student.getName());
            target.setRollNo(student.getRollNo());
        }

        public void deleteStudent(Student student)
        {
            students.Remove(student);
            Console.WriteLine("Student: Roll No " + student.getRollNo() + ", delete from database");
        }
    }
}

步骤 4-演示用法

DaoPatternDemo.cs

using System;

namespace DataAccessObjectPattern
{
    class DaoPatternDemo
    {
        static void Main(string[] args)
        {
            StudentDao studentDao = new StudentDaoImpl();

            //输出所有学生
            foreach (var item in studentDao.getAllStudents())
            {
                Console.WriteLine("Student: [RollNo : " + item.getRollNo() + ", Name : " + item.getName() + " ]");   
            }

            //更新学生
            Student student = studentDao.getAllStudents()[0];
            student.setName("Michael");
            studentDao.updateStudent(student);

            //获取学生
            studentDao.getStudent(0);
            Console.WriteLine("Student : [RollNo : " + student.getRollNo() + ", Name : " + student.getName() + " ]");

            Console.Read();
        }
    }
}

步骤 5-验证输出

Student: [RollNo : 0, Name : Robert ]
Student: [RollNo : 1, Name : John ]
Student: Roll No 0, updated in the database
Student: [RollNo : 0, Name : Michael ]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值