目录
一、观察者模式
1、开发环境
2、Model模型
3、View视图
4、Controller控制
5、过程演示
二、简单工厂模式
1、开发环境
2、产品类
3、工厂类
4、模式结构
5、用户操作界面与运行结果
一、观察者模式
1、开发环境
总体使用的是SSM(Spring+SpringMVC+MyBatis)框架结构,MVC模式体现在SpringMVC 使用了适配器模式,前端控制器使用 HandlerAdapter 来调用不同的 Controller,然后才是 Controller 调用 Model 产生数据模型; 产生的数据模型将会再次返回到前端控制器,并由前端控制器决定使用不同的模板引擎将页面进行渲染。
2、Model模型
在这个实验中,我们需要完成学籍的查询与录入,model自然是学籍类(Studentdocument.class),该类的属性如下:
该类的方法包括各个属性的get和set方法,来实现对属性的获取和修改。
根据model来建立数据库的student_document表,具体内容如下:
3、View视图
这里的用户操作界面(index.jsp)提供查询所有学籍的超链接和一个录入学籍的表单,供用户进行查询和录入的功能,其界面如下:
<%--
Created by IntelliJ IDEA.
User: xiachengyue
Date: 2021/10/23
Time: 8:36 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
保存某一学生的学籍,点击保存返回所有学生学籍
查询所有学籍信息
在用户点击查询所有学籍的超链接或在录入后点击保存后,会返回一个list.jsp界面,其包含数据库中所有的学籍信息,其界面如下:
<%--
Created by IntelliJ IDEA.
User: xiachengyue
Date: 2021/10/23
Time: 8:39 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Title
查询所有
姓名:${document.name}
身份证号:${document.idNum}
性别:${document.gender}
学号:${document.studentNum}
学历层次:${document.education}
学院:${document.college}
专业:${document.major}
班级:${document.studentClass}
入学时间:${document.addmission}
政治面貌:${document.politicalStatus}
民族:${document.folk}
籍贯:${document.address}
学制:${document.schoolSystem}
4、Controller控制
这里的控制层包括一个StudentdocumentController类,实现查询并返回所有学籍信息、录入学籍信息并返回所有信息的功能。
这里的查询功能通过Spring MVC整合Spring后,调用了studentDoucmentService接口,然后再通过Spring整合Mybatis,调用StudentdocumentDao接口,实现数据库查询,具体实现如下:
SpringMVC:StudentdocumentController中查询所有内容
@Controller
@RequestMapping("/studentdocument")
public class StudentdocumentController {
@Autowired
private StudentdocumentService studentdocumentService;
@RequestMapping("/findAll")
public String findAll(Model model){
System.out.println("表现层:查询所有。。");
List list = studentdocumentService.findAll();
model.addAttribute("list",list);
return "list";
}
Spring:StudentdocumentServiceImpl调用dao层查询所有内容
@Service("studentdocumentService")
public class StudentdocumentServiceImpl implements StudentdocumentService {
@Autowired
private StudentdocumentDao documentDao;
@Override
public List findAll() {
System.out.println("业务层:查询所有。。");
return documentDao.findAll();
}
Mybatis:StudentdocumentDao实现数据库查询
@Repository
public interface StudentdocumentDao {
//查询所有学籍信息
@Select("select * from student_document")
public List findAll();
在录入学籍信息时,首先通过 StudentdocumentController获取表单中输入的数据,整合成一个Studentdocument类,最后返回list.jsp页面。在调用关系中,通过Spring MVC整合Spring后,调用了studentDoucmentService接口,然后再通过Spring整合Mybatis,调用StudentdocumentDao接口,实现插入数据库。
SpringMVC:StudentdocumentController中保存录入信息并返回list.jsp界面
@RequestMapping("/save")
public void save(Studentdocument document, HttpServletRequest request,HttpServletResponse response) throws IOException {
studentdocumentService.savedocument(document);
response.sendRedirect(request.getContextPath()+"/studentdocument/findAll");
return ;
}
Spring:StudentdocumentServiceImpl调用dao层实现插入录入信息
@Override
public void savedocument(Studentdocument document) {
System.out.println("业务层:保存。。");
documentDao.savedocument(document);
}
Mybatis:StudentdocumentDao实现数据库的插入
//保存学籍信息
@Insert("insert into student_document (name,idNum,gender,studentNum,education,college,major,studentClass,addmission,politicalStatus,folk,address,schoolSystem) values (#{name},#{idNum},#{gender},#{studentNum},#{education},#{college},#{major},#{studentClass},#{addmission},#{politicalStatus},#{folk},#{address},#{schoolSystem})")
public void savedocument(Studentdocument document);
5、过程演示
测试录入功能:
启动服务器,进入http://localhost:8080/certificate_war_exploded/index.jsp ,在表单中输入张三同学的学籍信息
点击保存后,系统会返回所有的学籍信息。
查看数据库,确实存在张三同学的信息。
测试查询功能:
先在数据库中插入多条学籍信息,内容如下:
点击index.jsp中查询所有学籍信息的超链接,在list.jsp中确实返回了所有的信息。
二、简单工厂模式 1、开发环境
IDE使用Visual Studio 2019,使用C++编程实现。
2、产品类
在本实验中,需实现学籍的查询与录入,定义抽象产品类Studentdocument,其中声明产品类公共事务方法,方法均为虚方法,在具体产品类中实现。定义具体产品类undergraduate(本科生类),继承自Studentdocument类,实现父类声明的虚方法。定义具体产品类postgraduate(研究生类),继承自Studentdocument类,实现父类声明的虚方法。 其中,在Studentdocument类声明以下方法和属性,其中属性为各种学籍信息,方法包括设置学籍信息的方法及对学籍信息实现增删改查的方法。
#pragma once using namespace std; #includeclass Studentdocument {public: //方法 virtual void setname(string name1) = 0; virtual void setstudentNum(string studentNum1) = 0; virtual void setgender(string a) = 0; virtual void seteducation(string a) = 0; virtual void setcollege(string a) = 0; virtual void setmajor(string a) = 0; virtual void setclass1(string a) = 0; virtual void setaddmissionYear(string a) = 0; virtual void setpoliticalStatus(string a) = 0; virtual void setfolk(string a) = 0; virtual void setaddress(string a) = 0; virtual void setschoolSystem(string a) = 0; virtual void setidNum(string a) = 0; virtual string getdocument() = 0; virtual void postdocument() = 0; virtual void modifydocument() = 0; virtual void deletedocument() = 0; //属性 string name; string studentNum; string gender; string education; string college; string major; string class1; string addmissionYear; string politicalStatus; string folk; string address; string schoolSystem; string idNum; };
3、工厂类
定义documentFactory类,封装getStudentdocument方法,根据传入的参数不同创建、返回不同的具体产品类的对象,当参数为1,创建并返回undergraduate类对象,当参数为2,创建并返回postgraduate类对象。工厂类定义代码如下:
#include "documentFactory.h"
Studentdocument* documentFactory::getStudentdocument(int type) {
Studentdocument* s1 = NULL;
switch (type)
{
case 1: s1 = new undergraduate(); return s1; break;
case 2:s1 = new postgraduate(); return s1; break;
default:
break;
}
}
4、模式结构
图4.1 简单工厂模式的结构
5、用户操作界面与运行结果
main.cpp代码如下,其中根据用户输入的数字创建具体产品类的对象,然后调用产品类的方法对学籍信息进行设置。
#include "Studentdocument.h" using namespace std; #include#include "undergraduate.h" #include"documentFactory.h" #include int main() { Studentdocument* pstudentdocument = NULL; int type; cout << "请输入要创建的学籍信息,1代表本科生学籍信息,2代表研究生学籍信息n"; cin >> type; pstudentdocument = documentFactory::getStudentdocument(type); string ans; if (type == 1) { ans = "本科生"; } if (type == 2) { ans = "研究生"; } cout << "已创建"+ans+"的学籍,请按以下要求上传学籍信息n"; cout << "请输入姓名:"; string name; cin >> name; string studentNum1; cout << "请输入学号:"; cin >> studentNum1; string gender; cout << "请输入性别:"; cin >> gender; string education; cout << "请输入年级:"; cin >> education; string college; string major; if (type == 1) { cout << "请输入学院:"; cin >> college; cout << "专业:"; cin >> major; pstudentdocument->setcollege(college); pstudentdocument->setmajor(major); } if (type == 2) { cout << "请输入方向:"; cin >> college; cout << "导师:"; cin >> major; pstudentdocument->setcollege(college); pstudentdocument->setmajor(major); } pstudentdocument->setname(name); pstudentdocument->setstudentNum(studentNum1); pstudentdocument->setgender(gender); pstudentdocument->seteducation(education); cout << ans<<"学籍信息创建完毕:n" << pstudentdocument->getdocument(); }



