设计模式 - 组合实体模式
设计模式 - 前端控制器模式

设计模式 - 数据访问对象模式

violet posted @ 5 年前 in 笔记 with tags Design Pattern Golang , 446 阅读

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

  • 数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。
  • 数据访问对象实体类(Data Access Object concrete class) - 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。
  • 模型对象/数值对象(Model Object/Value Object) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main
 
import "fmt"
 
type Student struct {
    Name   string
    RollNo int
}
 
func (s *Student) GetName() string {
    return s.Name
}
 
func (s *Student) SetName(name string) {
    s.Name = name
}
 
func (s *Student) GetRollNo() int {
    return s.RollNo
}
 
func (s *Student) SetRollNo(no int) {
    s.RollNo = no
}
 
type StudentDAO interface {
    GetAllStudents() []*Student
    GetStudent(int) *Student
    UpdateStudent(*Student)
}
 
type StudentDAOImpl struct {
    Students []*Student
}
 
func NewStudentDAOImpl() *StudentDAOImpl {
    return &StudentDAOImpl{
        Students: []*Student{
            &Student{Name: "Robert", RollNo: 1},
            &Student{Name: "John", RollNo: 2},
        },
    }
}
 
func (s *StudentDAOImpl) GetAllStudents() []*Student {
    return s.Students
}
 
func (s *StudentDAOImpl) GetStudent(no int) *Student {
    for _, s := range s.Students {
        if s.RollNo == no {
            return s
        }
    }
 
    return nil
}
 
func (s *StudentDAOImpl) UpdateStudent(student *Student) {
    for _, s := range s.Students {
        if s.RollNo == student.RollNo {
            s.SetName(student.Name)
            fmt.Println("Student: roll no", student.RollNo, "updated in the database")
        }
    }
}
 
func main() {
    var dao StudentDAO
    dao = NewStudentDAOImpl()
    for _, s := range dao.GetAllStudents() {
        fmt.Println("Student: ", s.Name, "with roll no", s.RollNo)
    }
 
    student := dao.GetStudent(dao.GetAllStudents()[0].RollNo)
    student.SetName("Michael")
    dao.UpdateStudent(student)
 
    fmt.Println(dao.GetStudent(student.RollNo))
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter