第三阶段Blog作业三
Blog作业三
1.题目(7 - 1):
1.知识点:
此题目考查的知识点有接口的定义,接口的使用,主要是对Comparable接口的定义和使用,Comparable接口主要的作用是对两个类进行比较,是某个类的两个实例对象之间进行比较的手段,比如现在有有两个类,是某同一个类new出来的对象,如果要对这两个类里面的某一个属性进行比较可以是由Comparable接口,具体做法就是让该类继承Comparable接口,然后重写Comparable接口,
Class A implements Comparable<A> {
int a;
@Override
public int comparable(int a){
return (this.a - a)
}
}
使用:目标对象.compareTo(需要比较的对象);
比如:Class Main{
A a = new A;
A a1 = new A;
a.a = 3;
a1.a = 4;
System.out.print(a.compareTo(a1));
}
结果回输出-1;
这就是CompareTo接口的使用方法,通过CompareTo方法即可以进行对象对象之间的比较。
在本题中的体现为
此外该题还考察了继承,设计该题也是一个考察的知识点,必须搞清楚类与类之间的关系才能够更好的写出此题。

这里类之间的设计思想做出总结:
1.首先,我们先读题,该问题可以分出图形(具体包括圆形,矩形,三角形,梯形)作为类,然后即是卡牌又可以作为一个类,所以我们可以设计五个类,分别是:圆形,矩形,三角形,梯形,卡牌。
2.我们大致确定类有哪些后,就可以对每一个类的属性和方法进行分析,首先我们从圆形开始分析,圆形属性肯定的有半径这一属性,再此题中除此之外没有其他属性,接着我们考虑类的方法,圆的话肯定的有计算圆的面积的方法,以及校验对圆半径数据设置的合法性的方法,接着我们考虑圆的半径的初始化应该怎么做,初始化的手段有通过构造放法,通过set get设置,这里的话我们就要看一看圆和圆的半径的关系,不难发现,圆的半径可定和圆不是依赖关系,而应该是更强的关系,那应该是什么呢,首先不会是组合关系,因为,圆的半径这一数据不仅仅是只能是圆自己使用,而因该是其他类所可以得到的数据,因此不是组合关系,那因该是关联关系还是聚合关系呢?
因该是聚合关系,为什么呢?因为没有圆的半径肯定是圆的一部分,只要有圆就一定要有半径,所以是关联关系,那么我们就可以确定到底怎么初始化这一属性了,应该通过带参数构造方法,及在创建圆的时候就设置好圆的半径,带参数构造方法就必须通过外部传入半径才可以,所以就有保障了圆的半径这一属性不是圆所独有的且不可和分享的数据,所以可以通过带参数的构造方法来对圆的半径进行初始化,初次之外,为了得到圆的半径这一数据,所以好要有get set放法,可以的到的圆的半径这一属性,这一整套的分析过后圆这一类的设计既可以写出,圆的设计就到此为止,对了,还有圆的对数据的校验这一方法,最好每一类都要一和无参数的默认构造方法,因为就圆类来说,有可能你在创建圆的时候圆的半径并不能立刻确定下来,可能需要之后的计算才可以的到圆的半径,所以在创建圆的时候,还不能传入圆的半径,所以这时候就需要一个不带参数的构造方法,否则这种情况下就不能创建圆类,因为带参数的构造方法会覆盖掉圆类里面原本的不带参数的构造方法,所以在圆类里面还因该有无参数的构造方法。这样的话圆类就设计的比较完善了。对于矩形类,梯形类,三角形类和圆类都差不多,所以类的设计也都是如此的思路。卡片类也不例外,设计思路也是如此,但是值得注意的是卡片类还要实现接口compareTo,所以里面需要对compareTo进行重写。接着在每个类设计完成后,我们不难发现,个个图像类都有一个共同的特点,就是得到面积,判断数据是否合法,以及我们需要得到每一个图形的名字,所以我们不难想到,我们可以有一个图形类,这个图形类是一个抽象类,他的作用是对图形类的一个高度抽象,一个规定,所有以后的新创建的图形类需要即成该类,这样的话抽象类就是一个大致的框架,以后的图像类默认继承该类就好,可以提高代码的复用性。然后,我们考虑类与类之间的关系,很明显矩形类,圆形类,三角形类,梯形类之间是十分弱的依赖关系,但是他们都默认继承图形类,然后就是卡片类,卡片类的话肯定是将每一个图形类存在每一张卡片上去,所以和卡片类就是关联关系,所以就需要和每个图像类产生关联,即get到每个图形(圆类,矩形类,梯形类,三角形类),这时候抽象类的好处就现实出来了,我们不需要去和每个图形类产生关联,只需要和图形这一抽象类产生关联即可,这就是抽象类的一大好处,抽象类对图像类的抽象是的当这些图形类作为一个整体时可以大大简化代码的作用。最后就是开篇集类,该类是卡片类的集合,所以是对卡片类的操作类,可能有人会想为什么不写在main方法类里面,main类只不过是一个成型的入口罢了,所以不能太多操作放在main类里面。这样所有类的设计就完成了,就可以进行写代码的部分。
2.题目难度
这道题目难度适中,考察的地方主要是对类图的设计,不过对类的设计也没有太大的难度,所以总体来说题目难度适中。
2.题目(7 - 2)
1.知识点:
次题目主要是对上一个题目的续写,主要是增加功能,在我看来此题就是对你上一次的题目的复用性和代码的可拓展性的测试,主要是增加了一些新的功能,以及对之前的输出的修改,所以只要上一个题目你设计好了,这道题应该不是什么问题。
代码修改主要有以下部分:
class DealCardList {
protected ArrayList<Card> arrayList = new ArrayList<Card>();
DealCardList(){}
DealCardList(ArrayList<Integer> a){
for (int i = 0;i < a.size();i++){
switch (a.get(i)){
case 1:
double radius;
radius = Main.input.nextDouble();
Circle circle = new Circle(radius);
circle.setShapeName("Circle");
Card card = new Card(circle);
arrayList.add(card);
break;
case 2:
double width;
double length;
width = Main.input.nextDouble();
length = Main.input.nextDouble();
Rectangle rectangle = new Rectangle(width,length);
rectangle.setShapeName("Rectangle");
Card card1 = new Card(rectangle);
arrayList.add(card1);
break;
case 3:
double side1,side2,side3;
side1 = Main.input.nextDouble();
side2 = Main.input.nextDouble();
side3 = Main.input.nextDouble();
Triangle triangle = new Triangle(side1,side2,side3);
triangle.setShapeName("Triangle");
Card card2 = new Card(triangle);
arrayList.add(card2);
break;
case 4:
double height,topSide,bottomSide;
topSide = Main.input.nextDouble();
bottomSide = Main.input.nextDouble();
height = Main.input.nextDouble();
Trapezoid trapezoid = new Trapezoid(topSide,bottomSide,height);
trapezoid.setShapeName("Trapezoid");
Card card3 = new Card(trapezoid);
arrayList.add(card3);
break;
}
}
}
public boolean validate(){ for (int i = 0;i < arrayList.size();i++){ if (!arrayList.get(i).getShape().validate()){ return false; } }return true; }
public void cardSort(ArrayList<Card> arrayList){ Collections.sort(arrayList); }
public double getAllArea(){ double area = 0.0;for (int s = 0;s < arrayList.size();s++){ area+=arrayList.get(s).getShape().getArea(); }return area; }
public void showResult(){
double areaCircle = 0,areaRectangle = 0,areaTriangle = 0,areaTrapezoid = 0;
System.out.println("The original list:");
System.out.print("[");
for (Card card : arrayList){
System.out.print(card.getShape().getShapeName()+":");
System.out.printf("%.2f",card.getShape().getArea());
System.out.print(" ");
}
System.out.println("]");
System.out.println("The Separated List:");
ArrayList<Card> arrayListCircle = new ArrayList<>();
System.out.print("[");
for (Card card : arrayList){
if (card.getShape().getShapeName().equals("Circle")){
areaCircle += card.getShape().getArea();
System.out.print("Circle:");
System.out.printf("%.2f", card.getShape().getArea());
System.out.print(" ");
arrayListCircle.add(card);
}
}
System.out.print("]");
ArrayList<Card> arrayListRectangle = new ArrayList<>();
System.out.print("[");
for (Card card : arrayList) {
if (card.getShape().getShapeName() == "Rectangle") {
areaRectangle += card.getShape().getArea();
System.out.print("Rectangle:");
System.out.printf("%.2f", card.getShape().getArea());
System.out.print(" ");
arrayListRectangle.add(card);
}
}
System.out.print("]");
ArrayList<Card> arrayListTriangle = new ArrayList<>();
System.out.print("[");
for (Card card : arrayList) {
if (card.getShape().getShapeName() == "Triangle") {
areaTriangle += card.getShape().getArea();
System.out.print("Triangle:");
System.out.printf("%.2f", card.getShape().getArea());
System.out.print(" ");
arrayListTriangle.add(card);
}
}System.out.print("]");
ArrayList<Card> arrayListTrapezoid = new ArrayList<>();System.out.print("[");
for (Card card : arrayList) {
if (card.getShape().getShapeName() == "Trapezoid") {
areaTrapezoid += card.getShape().getArea();System.out.print("Trapezoid:");
System.out.printf("%.2f", card.getShape().getArea());System.out.print(" ");
arrayListTrapezoid.add(card);
}
}
System.out.print("]");System.out.println();System.out.println("The Separated sorted List:");
cardSort(arrayListCircle); cardSort(arrayListRectangle);cardSort(arrayListTriangle);cardSort(arrayListTrapezoid);
System.out.print("[");
for (int i = 0;i < arrayListCircle.size();i++){ System.out.print("Circle:");System.out.printf("%.2f",arrayListCircle.get(i).getShape().getArea());System.out.print(" "); }
System.out.print("][");
for (int i = 0;i < arrayListRectangle.size();i++){ System.out.print("Rectangle:");System.out.printf("%.2f",arrayListRectangle.get(i).getShape().getArea());System.out.print(" "); }
System.out.print("][");
for (int i = 0;i < arrayListTriangle.size();i++){ System.out.print("Triangle:");System.out.printf("%.2f",arrayListTriangle.get(i).getShape().getArea());System.out.print(" "); }
System.out.print("][");
for (int i = 0;i < arrayListTrapezoid.size();i++){ System.out.print("Trapezoid:");System.out.printf("%.2f",arrayListTrapezoid.get(i).getShape().getArea());System.out.print(" "); }
System.out.println("]");
System.out.print("The max area:");
double areaMax;
double[] areasShape = new double[4];
areasShape[0] = areaCircle;areasShape[1] = areaRectangle;areasShape[2] = areaTriangle;areasShape[3] = areaTrapezoid;
Arrays.sort(areasShape);
System.out.printf("%.2f",areasShape[3]);
}
}
2.题目难度:
题目难度适中,主要是对题目的代码设计的考察。
3.题目(8 - 1):
1.题目分析:
该题目是现实生活对银行的ATM机的大致模拟,拿到题目后,一时不知道怎么做,但是不要慌张,一点一点的分析,这些题目的分析思路大致都一样。
一:我们先将题目读一遍,然后从题目中找到可以建立那些类,很明显,该题目ATM机类,银联类,银行类,用户类,账户类,银行卡类,至于一行卡类,我最开始并不知道是否因该做成一个类,最开始我把它当做了用户类的一个属性,但是后来发现不对劲,因为我没有搞清楚现实生活中这些类之间的层级关系,银行卡是被直接包含在了银行账户类里面,然后银行账户又被包含在银行类里面,如果你直接讲银行卡类作为用户类的属性,意思就是银行卡直接包含在用户类里面,意思是可以通过用户类来直接获取银行卡类,但是并不是这样,用户可以有好几个账户,而每一个账户又有不同的银行卡,所以银行卡被账户类来调出来,因为是账户将银行卡分开的。
进过上面的一整套分析,我又将银行卡类作为账户类的属性,所以我就分成了银联类,银行类,ATM机类,用户类,账户类,其中我并没有将银行卡单独作为一给类,而仅仅是作为了账户类的一个属性,但是这种设计是很不好的,在实现的过程中,我发现了很多不方便的地方,以及不合理的地方,因为在现实生活中,我们在ATM机上是通过银行卡号来进行用户银行的相关的操作的,比如我们是通过银行卡来进行账户余额的查询和存取款,所以银行卡你仅仅将它设置成一个String类型的属性,仅仅用它来存储一个值,这是完全不合理的,银行卡因该有方法和属性,从而可以通过一行卡来查询,粗取款等一系列的操作,所以因该把它做成一个类。
所以,在设计类的时候,当我们不知道是不是因该把它设计成一个类的时候,我们就想一下,作为属性的话说明他仅仅就是一个用来存储值得东西,他的存在的直接意义就是获得其值;作为类的话说明他还有其他的作用,他有一定的功能,他不是仅仅来存储值的,他还有一定的方法,他又是有其他东西做成的,比如方法和属性。通过这样的思考的话,我们就可以大致判断是否将他作为一个类了。
通过一系列的分析和设计后,我最后将银行卡单独作为一个类。
所以目前我们有的类是,银联类,银行类,用户类,账户类,ATM机类,接下来我们来开始设计类的属性和方法。
首先,我们从银联类开始,银联类比较简单,我们咋思考类到底有哪些属性时,很简单,联想一下生活即可,想一下在生活中该类到底是怎样的,银联就是对银行的汇总,他是对银行的管理,所以银联类属性就是存储银行类的一个列表,接下来,我们来想一下该链表和银联类的关系,银行并不是银联所独有的,外部数据可以共享到银联里的数据,比如用户跨行取款就要使用到银联里的数据,而且同时银联里面有银行这一属性,但是银联里面可以暂时没有银行,即没有银行加入银联,综上分析后,银联和银行的关系时关联关系,关系已明确,我们就可以设计该属性的初始化数据的方法了,既然是关联关系,我们就可以通过set get方式进行初始化。也可以使用带参数的构造方法,但是使用带参数的构造方法后,就必需加上我参数的构造方法,因为是关联关系,如果只有带参数的构造方法,那么就变成了聚合关系,银联类就是这样。接下来,我们看一下银行类,首先属性里面肯定必须要有银行的号,银行名字,银行里面存的用户信息,所以还需要一个用户列表属性,同时还需要ATM机列表属性,同时不同的银行有不同的取款收费率,所以还学要有一个取款收费率的属性,接下来我们一个一个看他们这些属性和银行是什么关系,首先是银行号和银行的名字,所有的银行都有一个银行号和相应的名字,不管什么情况这都是必须的,就像人有名字一样,同样的这些数据有会被其他的类所获取到,所以银行的号和银行名字因该是聚合关系,所以因该使
还要加上一个默认构造方法,同时为了可以获得这两个属性,我们还要有get set方法(虽然这里set好像没啥用,但是set和个体是同时出现的,是天生的一对,所以也写上set,至少多一种初始化数据的方法没什么错误),用带参数的构造方法对其进行初始化,还要为了弥补带参数的构造方法将默认构造方法覆盖掉,还学要加上不带参数的默认构造方法,

接下来我们看用户列表这一属性,很明显这是关联关系,所以初始化的方法也就可以很快的写出了,
ATM机和用户列表是完全一样的初始化:

最后是取款收费率,同理是通过set get方法进行初始化的。
这样后,我们就已将将bank类设计完成,我们看一下User类的设计,User类里面的属性有用户的名字,用户的电话号码,以及用户的ID号码,这里不一一分析这些属性和User类的关系,放法都是一样的,通过上面的分析就可以得出他们同User类的关系,这里直接给出关系,用户的名字和用户是聚合关系,用户的电话号码和用户也是聚合关系,用户的ID号和用户也是聚合关系,同样的,我们可以通过set get方法来的到用户的三个属性的信息。然后我们看一下账户类,账户类的属性肯定有账户的号码,账户的余额,账户是哪一个用户,该账户隶属于哪一个银行,这就是账户类的属性,接下来就是他的方法了,账户有哪些方法呢,这里就不一一分析了,方法的分析和上面一样,这里直接给出代码


这里差点忘说了,这里对账户的银行卡号的查询用到了Iterator属性,这里是一个知识点,有点像C语言中的指针,在菜鸟教程里面有好多相关的教程,以及想过的使用方法,最后,我们看一下银行卡类。银行卡类的属性有银行卡号,银行卡所属的账户,银行卡的种类,银行卡类还有一个银行卡的无参数的默认构造方法,以及对卡号,所属账号进行初始化的带参数的构造方法,以及各个属性的set get方法,最后是ATM机类,属性有,ATM机好,所属银行,一个无参数的默认构造方法,用于给ATM机号,所属银行进行初始化,以及各个属性的set get方法,这时,可能有人会想为啥ATM机里面没有取款和存款以及查询余额的操作呢?这时候我们就要先想一下,确实取款和存款以及查询余额是ATM机的功能,但是放在ATM机里面真的合适吗,放在ATM机里面确实没问题,但是同单独成为一个类相比,这个并不合适,为什么呢,我们想一下,取款和存款以及查询余额这些行为里面都需要当前余额这一数据,所以我们单独做一个类然后让当前余额作为此属性即可。这样的话可以降低ATM机这一类的复杂度,并且是的功能专门化,更好的履行了单一职责这一原则。
这就是ATM机的整个分析过程。
2.题目难度:
次题目难度较大,思路不容易想,我在设计类的时候花了好大的功夫,但是从这道题中确实可以收获较多的思考方法。
3.题目改进建议: 这道题目,其实,如果数据初始化可以做成一个类也是比较好的,因为目前数据出事话都是在Main函数里面进行的,所以做成一个类的话就跟好了,舍得分工更加明确,所以可以做一个数据初始化类,在main方法中调用此类,构造方法的话有一个无参数的构造方法和一个带参数的构造方法,但参数的构造方法用于增添新的数据,而不带参数的构造方法用于初始化已有的数据。
4.总结:
此次我学到类怎么设计类,怎么更好的设计类,其次对类中方法的设计也有了更深的理解,所以这就是此次的收获。
5.对课堂和老师,实验的建议:
我觉得老师讲的挺好的,并没有什么大的建议,对课堂的话也没有什么打得建议,都觉得挺好的。特别的,我认为狼羊过河以及ATM机的实验特别的好,让我对面向对象的设计有了更深的理解,是的我掌握了java程序的设计理念。我希望以后还可以做到这样的实验。

浙公网安备 33010602011771号