• 读书笔记----软件设计原则、设计模式


    这个作业属于哪个课程 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模式有一个对象专门负责数据的访问,把数据的访问从业务中抽离出来,使数据访问与业务逻辑解耦。

  • 相关阅读:
    ExtJs中动态加载机制研究(转)
    ExtJs4 学习3 combox自动加载的例子
    Extjs 4学习2
    ExtJS 4学习
    javascript学习(知识点整理)
    ExtJS智能提示工具spket安装与破解
    eclipse慢 优化(转)
    疯狂学习java web5(SSI框架)
    疯狂学习java web4(jsp)
    疯狂学习java web3(javaScript)
  • 原文地址:https://www.cnblogs.com/zl1952168900/p/14534920.html
Copyright © 2020-2023  润新知