设计模式之为什么要学好设计模式

Posted 赵广陆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之为什么要学好设计模式相关的知识,希望对你有一定的参考价值。

目录


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. 获取数据库连接                                        
            conn=DriverManager.getConnection("jdbc:mysql:///jdbc_demo","root","root");
            //3. 创建语句对象                                          
            PreparedStatement 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
            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. 获取数据库连接                                        
            conn=DriverManager.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. 获取数据库连接                                        
            conn=DriverManager.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 ps=null;
        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 
            conn=JDBCUtil.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 
            conn=JDBCUtil.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);以上是关于设计模式之为什么要学好设计模式的主要内容,如果未能解决你的问题,请参考以下文章

0 Java实现 一篇文章说尽设计模式之六大原则

小白能学好UI设计吗

学好Spring,分三步!

Java 面试之单例模式

JAVA 设计模式 之 工厂模式

java设计模式之代理模式: