題目集7-9總結性blog
題目集7-9總結性blog
1、 前言
這三次作業並沒有什麼新的知識點,都是對之前學習的東西進行應用,主要有:1、繼承、多型的應用;2、ArrayList泛型的應用方法;3、Comparable介面及泛型的應用;4、單一職責原則的應用; 5、“開-閉”原則的應用。還有一些銀行、ATM機、銀行卡的相關課外知識,我是我之前沒了解過的。
題量也是比較少,三次作業只有四道題,當然難度也是有的,像設計第八次作業的類,
要使得程式的可維護性高,這樣第九次作業才好寫,這得花點功夫。
2、 設計與分析
(1) 題目集7(7-1)、(7-2)兩道題目的遞進式設計分析總結
題目7(7-1)詳情:
7-1 圖形卡片排序遊戲 (40 分)
掌握類的繼承、多型性使用方法以及介面的應用。詳見作業指導書2020-OO第07次作業-1指導書V1.0.pdf
輸入格式:
首先,在一行上輸入一串數字(1~4,整數),其中,1代表圓形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各數字之間以一個或多個空格分隔,以“0”結束。例如:1 3 4 2 1 3 4 2 13 0
然後根據第一行數字所代表的卡片圖形型別,依次輸入各圖形的相關引數,例如:圓形卡片需要輸入圓的半徑,矩形卡片需要輸入矩形的寬和長,三角形卡片需要輸入三角形的三條邊長,梯形 需要\輸入梯形的上底、下底以及高。各資料之間用一個或多個空格分隔。
輸出格式:
如果圖形數量非法(小於0)或圖形屬性值非法(數值小於0以及三角形三邊不能組成三角形),則輸出Wrong Format。
如果輸入合法,則正常輸出,所有數值計算後均保留小數點後兩位即可。輸出內容如下:
排序前的各圖形型別及面積,格式為圖形名稱1:面積值1圖形名稱2:面積值2 …圖形名稱n:面積值n,注意,各圖形輸出之間用空格分開,且輸出最後存在一個用於分隔的空格;
排序後的各圖形型別及面積,格式同排序前的輸出;
所有圖形的面積總和,格式為Sum of area:總面積值。
類圖:
複雜度:
原始碼:
import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util.Map; import java.text.DecimalFormat; import java.util.TreeMap; public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); DecimalFormat df2 = new DecimalFormat("####0.00"); ArrayList<Integer> cz = new ArrayList<Integer>(); Circle circle=new Circle(); Rectangle rectangle=new Rectangle(); Triangle triangle=new Triangle(); Trapezoid trapezoid=new Trapezoid(); for(int i=0;;i++) { int x=input.nextInt(); if(x==0&&i==0) { System.out.println("The original list:"+"\n"); System.out.println("The sorted list:"+"\n"); System.out.println("Sum of area:0.00"); System.exit(0); break; } if(x==0&&i!=0) break; else if(x>0&&x<=4) cz.add(x); else { System.out.println("Wrong Format"); System.exit(0); } } ArrayList<Double> area1 = new ArrayList<Double>(); ArrayList<Double> area2 = new ArrayList<Double>(); ArrayList<Double> area3 = new ArrayList<Double>(); ArrayList<Double> area4 = new ArrayList<Double>(); for(int i=0;i<cz.size();i++) { switch(cz.get(i)) { case 1:circle.r=input.nextDouble(); if(circle.r<0) { System.out.println("Wrong Format"); System.exit(0); } area1.add(circle.getArea()); break; case 2:rectangle.length=input.nextDouble(); rectangle.width=input.nextDouble(); if(rectangle.length<0||rectangle.width<0) { System.out.println("Wrong Format"); System.exit(0); } area2.add(rectangle.getArea()); break; case 3:triangle.side1=input.nextDouble(); triangle.side2=input.nextDouble(); triangle.side3=input.nextDouble(); if(triangle.side1+triangle.side2<=triangle.side3||triangle.side1+triangle.side3<=triangle.side2||triangle.side2+triangle.side3<=triangle.side1) { System.out.println("Wrong Format"); System.exit(0); } area3.add(triangle.getArea()); break; case 4:trapezoid.sd=input.nextDouble(); trapezoid.xd=input.nextDouble(); trapezoid.h=input.nextDouble(); if(trapezoid.sd<0||trapezoid.xd<0||trapezoid.h<0) { System.out.println("Wrong Format"); System.exit(0); } area4.add(trapezoid.getArea()); break; } } System.out.println("The original list:"); for(int i = 0,j = 0,k = 0,l=0;i+k+j+l<cz.size();) { switch(cz.get(i+j+k+l)) { case 1:System.out.print("Circle:"+df2.format(area1.get(i))+" ");i++;break; case 2:System.out.print("Rectangle:"+df2.format(area2.get(j))+" ");j++;break; case 3:System.out.print("Triangle:"+df2.format(area3.get(k))+" ");k++;break; case 4:System.out.print("Trapezoid:"+df2.format(area4.get(l))+" ");l++;break; } } System.out.println("\n"+"The sorted list:"); Map map = new TreeMap(); for(int i = 0,j = 0,k = 0,l=0;i+k+j+l<cz.size();) { switch(cz.get(i+j+k+l)) { case 1:map.put(area1.get(i),"Circle:");i++;break; case 2:map.put(area2.get(j),"Rectangle:");j++;break; case 3:map.put(area3.get(k),"Triangle:");k++;break; case 4:map.put(area4.get(l),"Trapezoid:");l++;break; } } ArrayList<Double> mj = new ArrayList<Double>(); for(int i = 0,j = 0,k = 0,l=0;i+j+k+l<cz.size();) { switch(cz.get(i+j+k+l)) { case 1:mj.add(area1.get(i));i++;break; case 2:mj.add(area2.get(j));j++;break; case 3:mj.add(area3.get(k));k++;break; case 4:mj.add(area4.get(l));l++;break; } } Collections.sort(mj); for(int i=cz.size()-1;i>=0;i--) { System.out.print(map.get(mj.get(i))); System.out.print(df2.format(mj.get(i))+" "); } double sum=0; for(int i=0;i<cz.size();i++) { sum=sum+mj.get(i); } System.out.println("\n"+"Sum of area:"+df2.format(sum)); } } class Circle{ DecimalFormat df2 = new DecimalFormat("####0.00"); double r; public double getArea() { return Math.PI*r*r; } public void show() { System.out.print("Circle:"+df2.format(this.getArea())+" "); } } class Rectangle{ DecimalFormat df2 = new DecimalFormat("####0.00"); double length; double width; public double getArea() { return length*width; } public void show() { System.out.print("Rectangle:"+df2.format(this.getArea())+" "); } } class Triangle{ DecimalFormat df2 = new DecimalFormat("####0.00"); double side1; double side2; double side3; public double getArea() { return Math.sqrt(((side1+side2+side3)/2)*(((side1+side2+side3)/2)-side1)*(((side1+side2+side3)/2)-side2)*(((side1+side2+side3)/2)-side3)); } public void show() { System.out.print("Triangle:"+df2.format(this.getArea())+" "); } } class Trapezoid{ DecimalFormat df2 = new DecimalFormat("####0.00"); double sd; double xd; double h; public double getArea() { return (sd+xd)*h*0.5; } public void show() { System.out.print("Trapezoid:"+df2.format(this.getArea())+" "); } }
題目7(7-2)詳情:
7-2 圖形卡片分組遊戲 (60 分)
掌握類的繼承、多型性使用方法以及介面的應用。 具體需求參考作業指導書。
輸入格式:
在一行上輸入一串數字(1~4,整數),其中,1代表圓形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各數字之間以一個或多個空格分隔,以“0”結束。例如:1 3 4 2 1 3 4 2 1 3 0
根據第一行數字所代表的卡片圖形型別,依次輸入各圖形的相關引數,例如:圓形卡片需要輸入圓的半徑,矩形卡片需要輸入矩形的寬和長,三角形卡片需要輸入三角形的三條邊長,梯形需要輸入梯形的上底、下底以及高。各資料之間用一個或多個空格分隔。
輸出格式:
如果圖形數量非法(<=0)或圖形屬性值非法(數值<0以及三角形三邊不能組成三角形),則輸出Wrong Format。
如果輸入合法,則正常輸出,所有數值計算後均保留小數點後兩位即可。輸出內容如下:
1、排序前的各圖形型別及面積,格式為[圖形名稱1:面積值1圖形名稱2:面積值2 …圖形名稱n:面積值n ],注意,各圖形輸出之間用空格分開,且輸出最後存在一個用於分隔的空格,在結束符“]”之前;
2、輸出分組後的圖形型別及面積,格式為[圓形分組各圖形型別及面積][矩形分組各圖形型別及面積][三角形分組各圖形型別及面積][梯形分組各圖形型別及面積],各組內格式為圖形名稱:面積值。按照“Circle、Rectangle、Triangle、Trapezoid”的順序依次輸出;
3、各組內圖形排序後的各圖形型別及面積,格式同排序前各組圖形的輸出;
4、各組中面積之和的最大值輸出,格式為The max area:面積值。
類圖:
複雜度:
第一題是輸入幾個不同的圖形,然後算出其面積,先輸出按輸入順序的面積,再輸出按面積從大到小的順序,最後輸出面積最大的;而第二題是在第一題的基礎上,可以輸入多個相同的圖形,但是 可以有不同的面積,而且要把不同的圖形分為不同的組,組的順序是固定的,但是組內圖形面積需要排序,最後輸出最大的一組面積之和。
由於第二題是在第一題的基礎上進行的,所以第一題的四個圖形類和存面積的方法可以完全用在第二題中,第二題比第一題多的用來分組程式碼:
System.out.print("["); for(int i=area1.size()-1;i>=0;i--) { System.out.print("Circle:"+df2.format(area1.get(i))+" "); } System.out.print("]"); System.out.print("["); for(int i=area2.size()-1;i>=0;i--) { System.out.print("Rectangle:"+df2.format(area2.get(i))+" "); } System.out.print("]"); System.out.print("["); for(int i=area3.size()-1;i>=0;i--) { System.out.print("Triangle:"+df2.format(area3.get(i))+" "); } System.out.print("]"); System.out.print("["); for(int i=area4.size()-1;i>=0;i--) { System.out.print("Trapezoid:"+df2.format(area4.get(i))+" "); } System.out.print("]");
(2)題目集8和題目集9兩道ATM機模擬題目的設計思路分析總結
題目8詳情:
7-1 ATM機類結構設計(一) (100 分)
設計ATM模擬系統,具體要求參見作業說明。OO作業8-1題目說明.pdf
輸入格式:
每一行輸入一次業務操作,可以輸入多行,最終以字元#終止。具體每種業務操作輸入格式如下:
存款、取款功能輸入資料格式:卡號 密碼 ATM機編號 金額(由一個或多個空格分隔), 其中,當金額大於0時,代表取款,否則代表存款。
查詢餘額功能輸入資料格式:卡號
輸出格式:
① 輸入錯誤處理
如果輸入卡號不存在,則輸出Sorry,this card does not exist.。
如果輸入ATM機編號不存在,則輸出Sorry,the ATM's id is wrong.。
如果輸入銀行卡密碼錯誤,則輸出Sorry,your password is wrong.。
如果輸入取款金額大於賬戶餘額,則輸出Sorry,your account balance is insufficient.。
如果檢測為跨行存取款,則輸出Sorry,cross-bank withdrawal is not supported.。
② 取款業務輸出
輸出共兩行,格式分別為:
[使用者姓名]在[銀行名稱]的[ATM編號]上取款¥[金額]
當前餘額為¥[金額]
其中,[]說明括起來的部分為輸出屬性或變數,金額均保留兩位小數。
③ 存款業務輸出
輸出共兩行,格式分別為:
[使用者姓名]在[銀行名稱]的[ATM編號]上存款¥[金額]
當前餘額為¥[金額]
其中,[]說明括起來的部分為輸出屬性或變數,金額均保留兩位小數。
④ 查詢餘額業務輸出
¥[金額]
金額保留兩位小數。
類圖:
題目9詳情:
7-1 ATM機類結構設計(二) (100 分)
設計ATM模擬系統,具體要求參見作業說明。OO作業9-1題目說明.pdf
輸入格式:
每一行輸入一次業務操作,可以輸入多行,最終以字元#終止。具體每種業務操作輸入格式如下:
取款功能輸入資料格式:卡號 密碼 ATM機編號 金額(由一個或多個空格分隔)
查詢餘額功能輸入資料格式:卡號
輸出格式:
①輸入錯誤處理
如果輸入卡號不存在,則輸出Sorry,this card does not exist.。
如果輸入ATM機編號不存在,則輸出Sorry,the ATM's id is wrong.。
如果輸入銀行卡密碼錯誤,則輸出Sorry,your password is wrong.。
如果輸入取款金額大於賬戶餘額,則輸出Sorry,your account balance is insufficient.。
②取款業務輸出
輸出共兩行,格式分別為:
業務:取款 [使用者姓名]在[銀行名稱]的[ATM編號]上取款¥[金額]
當前餘額為¥[金額]
其中,[]說明括起來的部分為輸出屬性或變數,金額均保留兩位小數。
③查詢餘額業務輸出
業務:查詢餘額 ¥[金額]
金額保留兩位小數。
類圖:
這兩次作業的關鍵點是題目八,因為題目九是在第八題的基礎上做的,那就先看題目八,第一步要做的是存資料,因為這裡有大量的衍生關係,比如中國銀聯有中國建設銀行,中國工商銀行等,然後每個銀行又有一些使用者,每個使用者有一個或多個銀行賬號,每個銀行賬號又有一個或多個銀行卡號。要做好這個題目,如何把這些關係有機聯絡起來是至關重要的。
我用的是map集合將這些關係聯絡起來,這樣就可以通過任何物件找到與其相關的資訊,然後相關的輸出方法是放在ATM類裡面,判斷是否合法操作的方法在Bankcard類裡面。
原始碼:
import java.util.Scanner; import java.util.HashMap; import java.util.Map; import java.text.DecimalFormat; public class Main{ Scanner input=new Scanner(System.in); public static void main(String[] args) { UnionPay unionpay=new UnionPay(); Bank bank=new Bank(); User user=new User(); Account account=new Account(); Bankcard bankcard=new Bankcard(); ATM atm=new ATM(); Scanner input=new Scanner(System.in); StringBuilder sb = new StringBuilder(); String b=input.nextLine(); while(!b.equals("#")) { sb.append(b).append("\n"); b=input.nextLine(); } String ss= String.valueOf(sb); String rows[]=ss.split("\n"); for(int i=0;i<rows.length;i++) { String dan[]=rows[i].split(" "); bankcard.put(i,rows); bankcard.check(user,dan.length); if(bankcard.flag!=0) System.exit(0); else { if(dan.length!=1) atm.showcz(bankcard,bank); else atm.showmoney(bankcard); } } } } class UnionPay{ Map<String, String> yl = new HashMap<String, String>();{ this.yl.put("中國工商銀行","銀聯"); this.yl.put("中國建設銀行","銀聯"); this.yl.put("中國農業銀行","銀聯"); } } class Bank extends UnionPay{ Map<String, String> jsyh = new HashMap<String, String>();{ this.jsyh.put("楊過","中國建設銀行"); this.jsyh.put("郭靖","中國建設銀行"); this.jsyh.put("張三丰","中國建設銀行"); this.jsyh.put("張無忌","中國工商銀行"); this.jsyh.put("韋小寶","中國工商銀行"); this.jsyh.put("令狐沖","中國工商銀行"); this.jsyh.put("喬峰","中國農業銀行"); this.jsyh.put("洪七公","中國農業銀行"); } Map<String, String> kind = new HashMap<String, String>();{ this.kind.put("6217000010041315709","借記賬號"); this.kind.put("6217000010041315715","借記賬號"); this.kind.put("6217000010041315718","借記賬號"); this.kind.put("6217000010051320007","借記賬號"); this.kind.put("6222081502001312389","借記賬號"); this.kind.put("6222081502001312390","借記賬號"); this.kind.put("6222081502001312399","借記賬號"); this.kind.put("6222081502001312400","借記賬號"); this.kind.put("6222081502051320785","借記賬號"); this.kind.put("6222081502051320786","借記賬號"); this.kind.put("6640000010045442002","貸記賬號"); this.kind.put("6640000010045442003","貸記賬號"); this.kind.put("6640000010045441009","貸記賬號"); this.kind.put("6630000010033431001","貸記賬號"); this.kind.put("6630000010033431008","貸記賬號"); } Map<String, String> sxf = new HashMap<String, String>();{ this.sxf.put("中國建設銀行","0.02"); this.sxf.put("中國工商銀行","0.03"); this.sxf.put("中國農業銀行","0.04"); } } class User extends Bank{ Map<String, String> yangguo = new HashMap<String, String>();{ this.yangguo.put("6217000010041315709","楊過"); this.yangguo.put("6217000010041315715","楊過"); this.yangguo.put("6217000010041315718","楊過"); this.yangguo.put("6217000010051320007","郭靖"); this.yangguo.put("6222081502001312389","張無忌"); this.yangguo.put("6222081502001312390","張無忌"); this.yangguo.put("6222081502001312399","張無忌"); this.yangguo.put("6222081502001312400","張無忌"); this.yangguo.put("6222081502051320785","韋小寶"); this.yangguo.put("6222081502051320786","韋小寶"); this.yangguo.put("6640000010045442002","張三丰"); this.yangguo.put("6640000010045442003","張三丰"); this.yangguo.put("6640000010045441009","令狐沖"); this.yangguo.put("6630000010033431001","喬峰"); this.yangguo.put("6630000010033431008","洪七公"); } } class ATM extends User{ Map<String, String> giao = new HashMap<String, String>();{ this.giao.put("01","中國建設銀行"); this.giao.put("02","中國建設銀行"); this.giao.put("03","中國建設銀行"); this.giao.put("04","中國建設銀行"); this.giao.put("05","中國工商銀行"); this.giao.put("06","中國工商銀行"); this.giao.put("07","中國農業銀行"); this.giao.put("08","中國農業銀行"); this.giao.put("09","中國農業銀行"); this.giao.put("10","中國農業銀行"); this.giao.put("11","中國農業銀行"); } DecimalFormat df2 = new DecimalFormat("####0.00"); public void showcz(Bankcard bankcard,Bank bank) { if(bankcard.money>0) { System.out.println("業務:取款 "+super.yangguo.get(bankcard.card)+"在"+giao.get(bankcard.bh)+"的"+bankcard.bh+"號ATM機上取款¥"+df2.format(bankcard.money)); System.out.println("當前餘額為¥"+df2.format(bankcard.yue())); } else { System.out.println("業務:存款 "+super.yangguo.get(bankcard.card)+"在"+giao.get(bankcard.bh)+"的"+bankcard.bh+"號ATM機上存款¥"+df2.format(-bankcard.money)); System.out.println("當前餘額為¥"+df2.format(bankcard.yue())); } } public void showmoney(Bankcard bankcard) { System.out.println("業務:查詢餘額 "+"¥"+df2.format(bankcard.yue())); } } class Account{ } class Bankcard extends ATM{ Map<String, String> qian = new HashMap<String, String>();{ this.qian.put("楊過","1"); this.qian.put("郭靖","2"); this.qian.put("張無忌","3"); this.qian.put("韋小寶","4"); this.qian.put("張三丰","5"); this.qian.put("令狐沖","6"); this.qian.put("喬峰","7"); this.qian.put("洪七公","8"); } String card; String mima; String bh; double money; double[] startmoney={10000.00,10000.00,10000.00,10000.00,10000.00,10000.00,10000.00,10000.00}; int flag=0; public void put(int i,String rows[]) { rows[i]=rows[i].replaceAll("\\s+", " "); String dan[]=rows[i].split(" "); int length=dan.length; if(length!=1) { card=dan[0]; mima=dan[1]; bh=dan[2]; money=Double.parseDouble(dan[3]); } else { card=dan[0]; mima="88888888"; bh="01"; money=0; } } public void check(User user,int length) { if(user.yangguo.get(card)==null) { System.out.println("Sorry,this card does not exist."); flag++; } else if(!mima.equals("88888888")) { System.out.println("Sorry,your password is wrong."); flag++; } else if(!bh.equals("11")&&!bh.equals("10")&&!bh.equals("09")&&!bh.equals("08")&&!bh.equals("07")&&!bh.equals("06")&&!bh.equals("05")&&!bh.equals("04")&&!bh.equals("03")&&!bh.equals("02")&&!bh.equals("01")) { System.out.println("Sorry,the ATM's id is wrong."); flag++; } else if((kind.get(card).equals("借記賬號")&&money>startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1])||(kind.get(card).equals("借記賬號")&&sfkh()&&money==startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1])||(yue1(startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1],money)<-50000)) { System.out.println("Sorry,your account balance is insufficient."); flag++; } else flag=0; } public double yue() { if(startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]<money&&startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]>0) { startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]=startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]-(money-startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1])*0.05; } if(startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]<money&&startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]<=0) { startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]=startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]-money*0.05; } if(sfkh()) startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]=startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]-money-money*Double.parseDouble(sxf.get(giao.get(bh))); else startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]=startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]-money; return startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]; } public double yue1(double a,double money1) { if(a<money1&&a>0) { a=a-(money1-a)*0.05; } if(a<money1&&a<=0) { a=a-money1*0.05; } if(sfkh()) a=a-money1-money1*Double.parseDouble(sxf.get(giao.get(bh))); else a=a-money1; return a; } public boolean sfkh() { if(jsyh.get(yangguo.get(card)).equals(giao.get(bh))) return false; else return true; } }
3、 踩坑心得
1、題目集7:for(int i = 0,j = 0,k = 0,l=0;i+k+j+l<cz.size();) {
switch(cz.get(i+j+k+l)) {
case 1:System.out.print("Circle:"+df2.format(area1.get(i))+" ");i++;break;
case 2:System.out.print("Rectangle:"+df2.format(area2.get(j))+" ");j++;break;
case 3:System.out.print("Triangle:"+df2.format(area3.get(k))+" ");k++;break;
case 4:System.out.print("Trapezoid:"+df2.format(area4.get(l))+" ");l++;break;
}
}
這樣輸出才是對的,但是我之前是這樣寫的:
for(int i = 0,;i <cz.size();) {
switch(cz.get(i+j+k+l)) {
case 1:System.out.print("Circle:"+df2.format(area1.get(i))+" ");i++;break;
case 2:System.out.print("Rectangle:"+df2.format(area2.get(i))+" ");i++;break;
case 3:System.out.print("Triangle:"+df2.format(area3.get(i))+" ");i++;break;
case 4:System.out.print("Trapezoid:"+df2.format(area4.get(i))+" ");i++;break;
}
}
這就是犯了把四個陣列看成一個數組的錯誤,這樣就得不到正確答案。
2、題目集8、9:餘額沒有用多個10000元,導致取錢全是取一張卡里面的錢
4、 改進建議
題目集7:這題給的類圖太詳細了,就連主方法的模板都給出了,我覺得沒必要這樣,這樣我感覺大部分人的程式碼都比較相似,學生會缺乏創新。
5、 總結
這三次題目集雖然題量少,但是寫起來也花了挺多時間,也學到了很多,現在我可以更好地運用正則表示式來分割資料,這是題目集8和9都要用到的;還學到了如何用map集合來處理資料;還有一些課外的,但是在現實生活中很常見的知識,比如ATM機;由於這幾道題目都要設計類,於是我現在對類的理解進一步深刻了,這就是Java面向物件的魅力,將一個大問題逐步分割成互相關聯的小問題。但是我對介面的運用還不是很好,還有我不知道介面的用處在哪;希望以後能有更多與現實生活相關的題目。