这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology/homework/11833 |
这个作业的目标 | 学习并理解各种设计模式来完善软件的开发 |
1、参考资料
《软件秘笈:设计模式那点事》——郑阿奇
2、读书笔记
2.1 什么是设计模式
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的话可以让代码更容易被他人理解,保证代码可靠性。
2.2 设计模式的类型
2.3 设计模式六大原则
开闭原则:对扩展开放,对修改关闭
里氏代换原则:任何基类可以出现的地方,子类一定可以出现
依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体。
接口隔离原则:使用多个隔离的接口,比使用单个接口要好(降低类之间的耦合度)
迪米特法则:又称最少知道原则:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立
合成复用原则:尽量使用合成/聚合的方式,而不是使用继承
2.4 部分模式的理解
由于模式太多,不可能一一赘述,下面主要对影响比较深的模式进行阐述
2.4.1 MVC模式
2.4.1.1 相关定义
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
Model(模型)-模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
View(视图)视图代表模型包含的数据的可视化。
Controller(控制器)-控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
2.4.1.2 实现
创建一个作为模型的 Student 对象。StudentView 是一个把学生详细信息输出到控制台的视图类,StudentController 是负责存储数据到 Student 对象中的控制器类,并相应地更新视图 StudentView。
2.4.1.2.1 创建模型
//Student.java
public class Student {
private String rollNo;
private String name;
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.4.1.2.2 创建视图
//StudentView.java
public class StudentView {
public void printStudentDetails(String studentName, String studentRollNo){
System.out.println("Student: ");
System.out.println("Name: " + studentName);
System.out.println("Roll No: " + studentRollNo);
}
}
2.4.1.2.3 创建控制器
//StudentController.java
public class StudentController {
private Student model;
private StudentView view;
public StudentController(Student model, StudentView view){
this.model = model;
this.view = view;
}
public void setStudentName(String name){
model.setName(name);
}
public String getStudentName(){
return model.getName();
}
public void setStudentRollNo(String rollNo){
model.setRollNo(rollNo);
}
public String getStudentRollNo(){
return model.getRollNo();
}
public void updateView(){
view.printStudentDetails(model.getName(), model.getRollNo());
}
}
2.4.1.2.4 使用 StudentController方法来演示 MVC 设计模式的用法
//MVCPatternDemo.java
public class MVCPatternDemo {
public static void main(String[] args) {
//从数据库获取学生记录
Student model = retrieveStudentFromDatabase();
//创建一个视图:把学生详细信息输出到控制台
StudentView view = new StudentView();
StudentController controller = new StudentController(model, view);
controller.updateView();
//更新模型数据
controller.setStudentName("John");
controller.updateView();
}
private static Student retrieveStudentFromDatabase(){
Student student = new Student();
student.setName("Robert");
student.setRollNo("10");
return student;
}
}
2.4.1.2.5 执行程序,输出结果
Student:
Name: Robert
Roll No: 10
Student:
Name: John
Roll No: 10
2.4.2 数据访问对象(DAO)模式
2.4.2.1 相关定义
数据访问对象模式用于把低级的数据访问API或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。
数据访问对象接口--该接口定义了在一个模型对象上要执行的标准操作。
数据访问对象实体类--该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库也可以是xml,或者是其他的存储机制。
模型对象/数值对象--该对象是简单的POJO包含了get/set方法来存储通过使用DAO类检索到的数据。
2.4.2.2 实现
创建一个作为模型对象或数值对象的Student对象。StudentDao是数据访问对象接口。StudentDaoImpl是实现了数据访问对象接口的实体类。DaoPatternDemo我们的演示类使用StudentDao来演示数据访问对象模式的用法。
2.4.2.2.1 创建数值对象
//Student.java
public class Student {
private String name;
private int rollNo;
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.4.2.2.2 创建数据访问对象接口
//StudentDao.java
import java.util.List;
public interface StudentDao {
public List<Student> getAllStudents();
public Student getStudent(int rollNo);
public void updateStudent(Student student);
public void deleteStudent(Student student);
}
2.4.2.2.3 创建实现了上述接口的实体类
//StudentDaoImpl.java
import java.util.ArrayList;
import java.util.List;
public class StudentDaoImpl implements StudentDao {
//列表是当作一个数据库
List<Student> students;
public StudentDaoImpl(){
students = new ArrayList<Student>();
Student student1 = new Student("Robert",0);
Student student2 = new Student("John",1);
students.add(student1);
students.add(student2);
}
@Override
public void deleteStudent(Student student) {
students.remove(student.getRollNo());
System.out.println("Student: Roll No " + student.getRollNo()
+", deleted from database");
}
//从数据库中检索学生名单
@Override
public List<Student> getAllStudents() {
return students;
}
@Override
public Student getStudent(int rollNo) {
return students.get(rollNo);
}
@Override
public void updateStudent(Student student) {
students.get(student.getRollNo()).setName(student.getName());
System.out.println("Student: Roll No " + student.getRollNo()
+", updated in the database");
}
}
2.4.2.2.4 使用 StudentDao 来演示数据访问对象模式的用法
//DaoPatternDemo.java
public class DaoPatternDemo {
public static void main(String[] args) {
StudentDao studentDao = new StudentDaoImpl();
//输出所有的学生
for (Student student : studentDao.getAllStudents()) {
System.out.println("Student: [RollNo : "
+student.getRollNo()+", Name : "+student.getName()+" ]");
}
//更新学生
Student student =studentDao.getAllStudents().get(0);
student.setName("Michael");
studentDao.updateStudent(student);
//获取学生
studentDao.getStudent(0);
System.out.println("Student: [RollNo : "
+student.getRollNo()+", Name : "+student.getName()+" ]");
}
}
2.4.2.2.5 执行程序,输出结果
Student: [RollNo : 0, Name : Robert ]
Student: [RollNo : 1, Name : John ]
Student: Roll No 0, updated in the database
Student: [RollNo : 0, Name : Michael ]
2.5 心得体会
我之前使用MVC模式的时候存在分层不清晰、随便分层的问题,但是现在明白了项目分层、定义接口和实现都是有意义的,不能为了一时的方便而忽略后期代码的维护工作量。我还通过看这本书理解到了DAO模式有一个对象专门负责数据的访问,把数据的访问从业务中抽离出来,使数据访问与业务逻辑解耦。