设计模式 - 数据访问对象模式
数据访问对象模式(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)) } |