当前位置: 首页 > news >正文

网站建设 郑州外贸论坛平台

网站建设 郑州,外贸论坛平台,建设银行网络平台,0505网页制作与网站建设目录1 回顾软件设计原则2 设计模式总览3 经典框架都在用设计模式解决问题1 回顾软件设计原则 不用设计模式并非不可以#xff0c;但是用好设计模式能帮助我们更好地解决实际问题#xff0c;设计模式最重要的是解耦。设计模式天天都在用#xff0c;但自己却无感知。我们把设… 目录1 回顾软件设计原则2 设计模式总览3 经典框架都在用设计模式解决问题1 回顾软件设计原则 不用设计模式并非不可以但是用好设计模式能帮助我们更好地解决实际问题设计模式最重要的是解耦。设计模式天天都在用但自己却无感知。我们把设计模式作为一个专题主要是学习设计模式是如何总结经验的把经验为自己所用。学设计模式也是锻炼将业务需求转换技术实现的一种非常有效的方式。 设计原则解释开闭原则对扩展开放对修改关闭依赖倒置原则通过抽象使各个类或者模块不相互影响实现松耦合。单一职责原则一个类、接口、方法只做一件事。接口隔离原则尽量保证接口的纯洁性客户端不应该依赖不需要的接口。迪米特法则又叫最少知道原则一个类对其所依赖的类知道得越少越好。里氏替换原则子类可以扩展父类的功能但不能改变父类原有的功能。合成复用原则尽量使用对象组合、聚合而不使用继承关系达到代码复用的目的。 2 设计模式总览 写出优雅的代码以下是超级乱的代码 public void setExammingForm(ExammingForm curForm,String parameters)throws BaseException { ...JSONObject jsonObj new JSONObject(parameters);//试卷主键 if(jsonObj.getString(examinationPaper_id)! null (!jsonObj.getString (examinationPaper_id).equals()))curForm.setExaminationPaper_id(jsonObj.getLong(examinationPaper_id));//剩余时间 if(jsonObj.getString(leavTime) ! null (!jsonObj.getString(leavTime).equals()))curForm.setLeavTime(jsonObj.getInt(leavTime));//单位主键 if(jsonObj.getString(organization_id)! null (!jsonObj.getString (organization_id).equals()))curForm.setOrganization_id(jsonObj.getLong(organization_id));//考试主键 if(jsonObj.getString(id)! null (!jsonObj.getString(id).equals()))curForm.setId(jsonObj.getLong(id));//考场主键 if(jsonObj.getString(examroom_id)! null (!jsonObj.getString (examroom_id).equals()))curForm.setExamroom_id(jsonObj.getLong(examroom_id));//用户主键 if(jsonObj.getString(user_id)! null (!jsonObj.getString(user_id).equals()))curForm.setUser_id(jsonObj.getLong(user_id));//专业代码 if(jsonObj.getString(specialtyCode)! null (!jsonObj.getString (specialtyCode).equals()))curForm.setSpecialtyCode(jsonObj.getLong(specialtyCode));//报考岗位 if(jsonObj.getString(postionCode)! null (!jsonObj.getString (postionCode).equals()))curForm.setPostionCode(jsonObj.getLong(postionCode));//报考等级 if(jsonObj.getString(gradeCode)! null (!jsonObj.getString (gradeCode).equals()))curForm.setGradeCode(jsonObj.getLong(gradeCode));//考试开始时间 curForm.setExamStartTime(jsonObj.getString(examStartTime));//考试结束时间 curForm.setExamEndTime(jsonObj.getString(examEndTime)); ...}优雅的赋值 注这里的下划线可以转换一下驼峰这里我要总结几篇文章 JSONType(naming PropertyNamingStrategy.SnakeCase) public class ExammingFormVo extends ExammingForm{private String examinationPaperId; //试卷主键 private String leavTime; //剩余时间 private String organizationId; //单位主键 private String id; //考试主键 private String examRoomId; //考场主键 private String userId; //用户主键 private String specialtyCode; //专业代码 private String postionCode; //报考岗位 private String gradeCode; //报考等级 private String examStartTime; //考试开始时间 private String examEndTime; //考试结束时间 ...}public void setExammingForm(ExammingForm form,String parameters)throws BaseException {try {JSONObject json new JSONObject(parameters);ExammingFormVo vo JSONObject.parseObject(json,ExammingFormVo.class);form vo;}catch (Exception e){e.printStackTrace();}}更好地重构项目 请查看以下代码发现问题 public void save(Student stu){String sql INSERT INTO t_student(name,age) VALUES(?,?);Connection conn null;Statement st null;try{//1. 加载注册驱动 Class.forName(com.mysql.jdbc.Driver);//2. 获取数据库连接 connDriverManager.getConnection(jdbc:mysql:///jdbc_demo,root,root);//3. 创建语句对象 PreparedStatement psconn.prepareStatement(sql);ps.setObject(1,stu.getName());ps.setObject(2,stu.getAge());//4. 执行SQL语句 ps.executeUpdate();//5. 释放资源 }catch(Exception e){e.printStackTrace();}finally{try{if(st ! null)st.close();}catch(SQLException e){e.printStackTrace();}finally{try{if(conn ! null)conn.close();}catch(SQLException e){e.printStackTrace();}}}}//删除学生信息 public void delete(Long id){String sql DELETE FROM t_student WHERE id?;Connection conn null;Statement st null;try{//1. 加载注册驱动 Class.forName(com.mysql.jdbc.Driver);//2. 获取数据库连接 connDriverManager.getConnection(jdbc:mysql:///jdbc_demo,root,root);//3. 创建语句对象 PreparedStatement ps conn.prepareStatement(sql);ps.setObject(1,id);//4. 执行SQL语句 ps.executeUpdate();//5. 释放资源 }catch(Exception e){e.printStackTrace();}finally{try{if(st ! null)st.close();}catch(SQLException e){e.printStackTrace();}finally{try{if(conn ! null)conn.close();}catch(SQLException e){e.printStackTrace();}}}}//修改学生信息 public void update(Student stu){String sql UPDATE t_student SET name?,age? WHERE id?;Connection conn null;Statement st null;try{//1. 加载注册驱动 Class.forName(com.mysql.jdbc.Driver);//2. 获取数据库连接 connDriverManager.getConnection(jdbc:mysql:///jdbc_demo,root,root);//3. 创建语句对象 PreparedStatement ps conn.prepareStatement(sql);ps.setObject(1,stu.getName());ps.setObject(2,stu.getAge());ps.setObject(3,stu.getId());//4. 执行SQL语句 ps.executeUpdate();//5. 释放资源 }catch(Exception e){e.printStackTrace();}finally{try{if(st ! null)st.close();}catch(SQLException e){e.printStackTrace();}finally{try{if(conn ! null)conn.close();}catch(SQLException e){e.printStackTrace();}}}}上述代码的功能没问题但是代码重复得太多因此可以进行抽取把重复代码放到一个工具类JdbcUtil里。 工具类 public class JdbcUtil {private JdbcUtil() { }static {//1. 加载注册驱动 try {Class.forName(com.mysql.jdbc.Driver);} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() {try {//2. 获取数据库连接 return DriverManager.getConnection(jdbc:mysql:///jdbc_demo, root, root);} catch (Exception e) {e.printStackTrace();}return null;}//释放资源 public static void close(ResultSet rs, Statement st, Connection conn) {try {if (rs ! null)rs.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (st ! null)st.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn ! null)conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}只需要在实现类中直接调用工具类JdbcUtil中的方法即可。 //增加学生信息public void save(Student stu) {String sql INSERT INTO t_student(name,age) VALUES(?,?);Connection conn null;PreparedStatement psnull;try {conn JDBCUtil.getConnection();//3. 创建语句对象ps conn.prepareStatement(sql);ps.setObject(1, stu.getName());ps.setObject(2, stu.getAge());//4. 执行SQL语句ps.executeUpdate();//5. 释放资源} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(null, ps, conn);}}//删除学生信息public void delete(Long id) {String sql DELETE FROM t_student WHERE id?;Connection conn null;PreparedStatement ps null;try {connJDBCUtil.getConnection();//3. 创建语句对象ps conn.prepareStatement(sql);ps.setObject(1, id);//4. 执行SQL语句ps.executeUpdate();//5. 释放资源} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(null, ps, conn);}}//修改学生信息public void update(Student stu) {String sql UPDATE t_student SET name?,age? WHERE id?;Connection conn null;PreparedStatement ps null;try {connJDBCUtil.getConnection();//3. 创建语句对象ps conn.prepareStatement(sql);ps.setObject(1, stu.getName());ps.setObject(2, stu.getAge());ps.setObject(3, stu.getId());//4. 执行SQL语句ps.executeUpdate();//5. 释放资源} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(null, ps, conn);}}public Student get(Long id) {String sql SELECT * FROM t_student WHERE id?;Connection conn null;Statement st null;ResultSet rs null;PreparedStatement psnull;try {conn JDBCUtil.getConnection();//3. 创建语句对象ps conn.prepareStatement(sql);ps.setObject(1, id);//4. 执行SQL语句rs ps.executeQuery();if (rs.next()) {String name rs.getString(name);int age rs.getInt(age);Student stu new Student(id, name, age);return stu;}//5. 释放资源} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(rs, ps, conn);}return null;}public ListStudent list() {ListStudent list new ArrayList();String sql SELECT * FROM t_student ;Connection conn null;Statement st null;ResultSet rs null;PreparedStatement psnull;try {connJDBCUtil.getConnection();//3. 创建语句对象ps conn.prepareStatement(sql);//4. 执行SQL语句rs ps.executeQuery();while (rs.next()) {long id rs.getLong(id);String name rs.getString(name);int age rs.getInt(age);Student stu new Student(id, name, age);list.add(stu);}//5. 释放资源} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(rs, ps, conn);}return list;}虽然完成了重复代码的抽取但数据库中的账号密码等直接显示在代码中不利于后期账户密码改动的维护。可以建立一个db.propertise文件用来存储这些信息。 driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql:///jdbcdemo usernameroot passwordroot 只需要在工具类JdbcUtil中获取里面的信息即可。 static {//1. 加载注册驱动 try {ClassLoader loader Thread.currentThread().getContextClassLoader();InputStream inputStream loader.getResourceAsStream(db.properties);p new Properties();p.load(inputStream);Class.forName(p.getProperty(driverClassName));} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() {try {//2. 获取数据库连接 return DriverManager.getConnection(p.getProperty(url), p.getProperty(username),p.getProperty(password));} catch (Exception e) {e.printStackTrace();}return null;}代码抽取到这里貌似已经完成但在实现类中依然存在部分重复代码在DML操作中除了SQL和设置值的不同其他都相同把相同的部分抽取出来把不同的部分通过参数传递进来无法直接放在工具类中。此时可以创建一个模板类JdbcTemplate创建一个DML和DQL的模板来对代码进行重构。 //查询统一模板public static ListStudent query(String sql,Object...params){ListStudent listnew ArrayList();Connection conn null;PreparedStatement psnull;ResultSet rs null;try {connJDBCUtil.getConnection();psconn.prepareStatement(sql);//设置值for (int i 0; i params.length; i) {ps.setObject(i1, params[i]);}rs ps.executeQuery();while (rs.next()) {long id rs.getLong(id);String name rs.getString(name);int age rs.getInt(age);Student stu new Student(id, name, age);list.add(stu);}//5. 释放资源} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(rs, ps, conn);}return list;}实现类直接调用方法即可。//增加学生信息public void save(Student stu) {String sql INSERT INTO t_student(name,age) VALUES(?,?);Object[] paramsnew Object[]{stu.getName(),stu.getAge()};JdbcTemplate.update(sql, params);}//删除学生信息public void delete(Long id) {String sql DELETE FROM t_student WHERE id ?;JdbcTemplate.update(sql, id);}//修改学生信息public void update(Student stu) {String sql UPDATE t_student SET name ?,age ? WHERE id ?;Object[] paramsnew Object[]{stu.getName(),stu.getAge(),stu.getId()};JdbcTemplate.update(sql, params);}public Student get(Long id) {String sql SELECT * FROM t_student WHERE id?;ListStudent list JDBCTemplate.query(sql, id);return list.size()0? list.get(0):null;}public ListStudent list() {String sql SELECT * FROM t_student ;return JDBCTemplate.query(sql);} 这样重复的代码基本就解决了但有一个很严重的问题就是这个程序DQL操作中只能处理Student类和t_student表的相关数据无法处理其他类比如Teacher类和t_teacher表。不同的表不同的对象应该有不同的列不同列处理结果集的代码就应该不一样处理结果集的操作只有DAO自己最清楚。也就是说处理结果的方法根本就不应该放在模板方法中应该由每个DAO自己来处理。因此可以创建一个IRowMapper接口来处理结果集。 public interface IRowMapper {//处理结果集 List rowMapper(ResultSet rs) throws Exception;} DQL模板类中调用IRowMapper接口中的handle方法提醒实现类自己去实现mapping方法。 public static ListStudent query(String sql,IRowMapper rsh, Object...params){ListStudent list new ArrayList();Connection conn null;PreparedStatement psnull;ResultSet rs null;try {conn JdbcUtil.getConnection();ps conn.prepareStatement(sql);//设置值 for (int i 0; i params.length; i) {ps.setObject(i1, params[i]);}rs ps.executeQuery();return rsh.mapping(rs);//5. 释放资源 } catch (Exception e) {e.printStackTrace();} finally {JdbcUtil.close(rs, ps, conn);}return list ;}实现类自己去实现IRowMapper接口的mapping方法想要处理什么类型的数据在里面定义即可。 public Student get(Long id) {String sql SELECT * FROM t_student WHERE id ?;ListStudent list JdbcTemplate.query(sql,new StudentRowMapper(), id);return list.size()0? list.get(0):null;}public ListStudent list() {String sql SELECT * FROM t_student ;return JdbcTemplate.query(sql,new StudentRowMapper());}class StudentRowMapper implements IRowMapper{public List mapping(ResultSet rs) throws Exception {ListStudent listnew ArrayList();while(rs.next()){long id rs.getLong(id);String name rs.getString(name);int age rs.getInt(age);Student stunew Student(id, name, age);list.add(stu);}return list;}}到这里为止实现ORM的关键代码已经大功告成但是DQL查询不单单要查询学生信息List类型还要查询学生数量这时就要通过泛型来完成。 public interface IRowMapperT {//处理结果集 T mapping(ResultSet rs) throws Exception;}public static T T query(String sql,IRowMapperT rsh, Object...params){Connection conn null;PreparedStatement psnull;ResultSet rs null;try {conn JdbcUtil.getConnection();ps conn.prepareStatement(sql);//设置值 for (int i 0; i params.length; i) {ps.setObject(i1, params[i]);}rs ps.executeQuery();return rsh.mapping(rs);//5. 释放资源 } catch (Exception e) {e.printStackTrace();} finally {JdbcUtil.close(rs, ps, conn);}return null;}StudentRowMapper类的代码如下。 class StudentRowMapper implements IRowMapperListStudent{public ListStudent mapping(ResultSet rs) throws Exception {ListStudent listnew ArrayList();while(rs.next()){long id rs.getLong(id);String name rs.getString(name);int age rs.getInt(age);Student stunew Student(id, name, age);list.add(stu);}return list;}}这样不仅可以查询List还可以查询学生数量。 public Long getCount(){String sql SELECT COUNT(*) total FROM t_student;Long totalCount (Long) JdbcTemplate.query(sql,new IRowMapperLong() {public Long mapping(ResultSet rs) throws Exception {Long totalCount null;if(rs.next()){totalCount rs.getLong(total);}return totalCount;}});return totalCount;}这样重构设计就已经完成好的代码能让我们以后维护更方便因此学会对代码的重构是非常重要的。 3 经典框架都在用设计模式解决问题 比如Spring就是一个把设计模式用得淋漓尽致的经典框架。本书会结合JDK、Spring、MyBatis、Netty、Tomcat、Dubbo等经典框架的源码对设计模式展开分析帮助大家更好、更深入地理解设计模式在框架源码中的落地。 经典框架都在用设计模式解决问题 Spring就是一个把设计模式用得淋漓尽致的经典框架其实从类的命名就能看出来我来一一列举 设计模式名称举例工厂模式BeanFactory装饰器模式BeanWrapper代理模式AopProxy委派模式DispatcherServlet策略模式HandlerMapping适配器模式HandlerAdapter模板模式JdbcTemplate观察者模式ContextLoaderListener 围绕 Spring 的 IOC、AOP、MVC、JDBC这样的思路展开根据其设计类型来设计讲解顺序 类型名称英文创建型模式工厂模式Factory Pattern单例模式Singleton Pattern原型模式Prototype Pattern结构型模式适配器模式Adapter Pattern装饰器模式Decorator Patter代理模式Proxy Pattern行为性模式策略模式Strategy Pattern模板模式Template Pattern委派模式Delegate Pattern观察者模式Observer Pattern
http://www.hkea.cn/news/14271579/

相关文章:

  • 网站设计费用志谷歌浏览器下载手机版官网
  • 网站做下载文件模块网站运营费用预算
  • 怎么推广网站链接wordpress导出媒体
  • 企业宣传网站建设方案博文阅读网站建设
  • 企业做网站优点wordpress引用php
  • 想建设一个网站自己接一些小活哪里可以做公司网站
  • 网站开发软件 论文 摘要网站建设如何传视频教程
  • 网站强制qq弹窗代码手机怎么做自己的网站
  • 程序员代做网站违法黑龙江住房城乡建设厅网站
  • nodejs 如何做网站后端华龙seo排名优化培训
  • 一个人做企业网站要多少天展厅设计收费标准
  • APP网站怎么做网站做下载wordpress
  • 网站长期建设运营计划书seo网站建设课程
  • 百度公司可以做网站么廊坊微信网站建设
  • 用c 做网站可以吗错题网站开发
  • 网站流量来源查询如何建设酒店预订系统网站
  • 成都高端建设网站h5模板免费
  • 网站推广前景怎么样税收大数据
  • 做soho一定要做网站吗建设主管部门网站
  • 网站建设技术质量指标公司门户网站建设公司
  • seo网站三种链接网络网页设计制作公司
  • 南京500元做网站多用户旅游网站开发
  • 网站建立需要什么技术音乐网站后台模板
  • 网站链接查询四平网站优化
  • 专业做相册书的网站免费的html大作业网站
  • 专业建站推广服务wordpress 后台登陆 修改
  • 上线了做网站怎么查看张家界seo优化
  • 深圳企业学校网站建设辽宁高速公路建设局网站
  • 做网站用建站模版好还是定制好深圳网站建设公司小江
  • 靖州网站建设wordpress 调用自定义模板