第一次Blog作业(修正) 21201112 李夏楠

五次雨刷作业总结

  这五次的雨刷作业的主要目的,是让我们对 Java 编程有一个初步的了解,包括

       1、类的声明和构造方法、方法的调用、参数传递、对象的构造与使用  

  2、类和类之间的五种基本关系(关联、聚合、组合、依赖、继承)

  3、Java的七大设计原则(单一职责原则、迪米特法则、里氏代换原则、合成复用原     

    则、依赖倒转原则、开闭原则、接口隔离原则)

  4、private、public等关键的使用场合与使用方法

  5、Java语言中继承的基本概念及使用方法

  5、单例模式的使用

 

第一次作业:

Task:

 使用Java语言对上述雨刷问题进行编程模拟完成司机对雨刷系统的控制及测试

 设计思路:

在一个类中,写出多个方法,再由主方法调用其他方法,完成司机对雨刷系统的控制。

 

类图如下:

缺点: 

只有一个类,无法完成单一职责原则。

 

第二次作业:

Task:

重构第一次的雨刷问题,需求不变,采用面向对象技术,合理设计实体类、业务(控制)类、接口类及各个类之间的关系,务必符合SRP(Single Responsibility Principe,单一职责原则)

设计思路:

设计 雨刷类,控制类,挡位类,刻度类,键盘输入类 以完成单一职责

类图如下:

总结 :

这一次的作业主要是考察类与对象,上一次作业完成时还并没有接触类的概念,因此只有一个主类,从这一次作业以后便开始接触了类与对象的概念,慢慢熟悉了类与对象的使用。对合理地设计实体类、业务类、接口类等有了初步的了解。

 

 第三次作业:

Task:

重构第二次作业雨刷问题,需求不变,采用面向对象技术,合理设计实体类、业务(控制)类、接口类及各个类之间的关系,符合SRP(Single Responsibility Principe,单一职责原则)以及Demeter法则(Law of Demeter).

设计思路:

增加司机类,用来调用挡位和刻度的增减

类图如下:

 总结:

这次作业的主要目的是重新设计,使代码符合SPR和Demeterfaze。但是我认为完成的不是很好,Driver和Control类都对Lever类和Dial类进行了调用,应该只有Control对Lever类和Dial类进行调用。

 

 第四次作业:

Task:

重构第三次作业雨刷问题,需求不变,设计必须符合MVC模式,尝试嵌入单列模式。

设计思路:

增加View类,负责所以的输入与输出

核心代码:

private Lever(){
        // TODO 自动生成的构造函数存根
    }
    private static Lever lever = new Lever();
    public static Lever getlnstance() {
        if(lever==null) {
            return new Lever();
        }
        else {
            return lever;
        }
    }

利用上图方法,实现单列模式。

类图如下:

 总结:

这次作业的主要目的是尝试使用单列模式。单列模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名 称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们 还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例,以此确保所有的对象都访问一个实例 。

 

 第五次作业:

Task:

重构第四次作业雨刷问题,需求变更为该系统可以适用多种雨刷系统,采用面向对象技术,合理设计实体类、业务(控制)类、接口类、各个类的抽象父类以及相互的关系,符合SRP(Single Responsibility Principe,单一职责原则)、Demeter法则。

设计思路:

通过为挡位类,控制类,刻度类设置父类,以实现系统适应多种雨刷系统和代码的复用。

核心代码:

public abstract class Dial {
    private int dial=1;
    
    public Dial() {
        // TODO 自动生成的构造函数存根
    }

    public Dial(int dial) {
        this.dial=dial;
    }

    public int getDial() {
        return this.dial;
    }
    
    public void setDial(int dial) {
        this.dial = dial;
    }

    public abstract void upDial();
    
    public void downDial() {
        if(this.dial>1) {
            this.dial--;
        }
    }
}

public class FourDial extends Dial{

    public FourDial() {
        super();
        // TODO 自动生成的构造函数存根
    }

    @Override
    public void upDial() {
        // TODO 自动生成的方法存根
        if(getDial()<4) {
            setDial(getDial()+1);
        }    
    }

}

public class ThreeDial extends Dial{

    public ThreeDial() {
        super();
        // TODO 自动生成的构造函数存根
    }

    @Override
    public void upDial() {
        // TODO 自动生成的方法存根
        if(getDial()<3) {
            setDial(getDial()+1);
        }    
    }

}

 

类图如下:

 总结:

 这次的主要任务是学会设置父类,子类以实现代码的复用。通过设置Control,Lever,Dial这三个类为父类,实现了2种挡位,2种刻度,共四种组合方法的调节,使得这个雨刷系统可以适配更多的雨刷。其次,这样写降低了代码的耦合度,比如想要挡位上升,直接调用Lever父类的upPos()方法即可,无需关心某个子类具体是怎么做的。代码的拓展性也得到了提升,如果程序需要更多种刻度和挡位,只要多写几个子类,让Lever,Dial这两个父类分别继承,再写一个Control的子类,判断各个挡位和刻度的速度即可。

至此关于五次雨刷的作业就结束了,从第一次的不会声明类,只会写几个方法;到第二次的合理设计实体类、业务(控制)类、接口类及各个类之间的关系以达成单一职责;到第三次的对单一职责的完善并且达到迪米特法则;第四次使用单例模式;第五次使用多态。这几次的作业总体难度不大,考查点基本是非常基础的点,完成了对Java的七大设计原则(单一职责原则、迪米特法则、里氏代换原则、合成复用原则、依赖倒转原则、开闭原则、接口隔离原则)基本了解。在五次作业中我还是收获了很多东西的,最大的一点就是类与类的设计,毕竟我们现在还没有达到看完题目就知道该如何设计类的水平,所以在现阶段,在设计类的时候要时刻把类与类设计的设计原则牢记在心。当类的设计完成后,一定要再次思考所设计的类之间的紧密程度,要考虑类之间的耦合度是否过高,是否合理,是否达到了单一职责原则等等。

 

PTA作业总结

 

1、日期问题面向对象设计(聚合一)

Task:

 

2、日期问题面向对象设计(聚合二)

Task:

总结:这两次的作业都是是根据类图写代码。每个对象里的方法都有相似之处,但是对象之间的调用有很大不同。第一次是通过DateUtil调用Day,Day调用Month,Month调用Year。第二次则是通过DateUtil分别调用Day、Month、Year达到目的。两次的调用不一样,但都是解决了同一个问题,给了人两种不同的思路。

第一次中Day的构造函数中调用了Month的构造函数,给了新的思路。

 

 3、串口字符解析

Task:

RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。

题目代码:

import java.util.Scanner;
public class Main
  {
    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    String s = input.nextLine();
    if(cheak(s)) {
        System.out.print("null data");
    }
    else {
        int j = 0;
        for(int i=0;(s.length()-i)>10;i++) {
            char k = s.charAt(i);
            if(k=='0') {
                j++;
                String data = s.substring(i+1,i+9);
                char odd = s.charAt(i+9);
                char end = s.charAt(i+10);
                int times = 0;
                for(int q=0; q<8;q++) {
                    if(data.charAt(q)=='1') {
                        times++;
                    }
                }
                int odd1 = (int)odd;
                if((times%2)!=(odd1-48) && end=='1') {
                    System.out.println(j +":" + data);
                }
                else if((times%2)==(odd1-48) && end!='1') {
                    System.out.println(j +":validate error");
                }
                else if((times%2)==(odd1-48) && end=='1') {
                    System.out.println(j +":parity check error");
                }
                else if((times%2)!=(odd1-48) && end!='1') {
                    System.out.println(j +":validate error");
                }
                i=i+10;
            }
        }
        
    }
    
  }
    
    public static boolean cheak(String a) {
        if(a.length()<11) {
            return true;
        }
        
        int flag=0;
        for (int i = 0; i < a.length(); i++) {
            char k = a.charAt(i);
            if(k=='0') {
                flag++;
            }
        }
        if(flag==0) {
            return true;
        }
        else {
            return false;
        }
    }
}

 

总结:了解到字符串的使用方式,学习从字符串中提取字符 s.charAt(i+9) 和从字符串中提取字符串s.substring(i+1,i+9)

posted @ 2022-04-13 21:51  李mini白  阅读(65)  评论(0)    收藏  举报