為深入理解面向物件——大牛生小牛的問題
阿新 • • 發佈:2019-02-10
最近在看老馬的設計模式的視訊,在對於面向物件的理解時。有個問題很能幫助我們理解面向物件,於是乎自己也照著網上的一些例項做了下。問題是這樣的——農場有頭大母牛,每年生頭小母牛,小牛五年後生小母牛,問20年後農場一共有多少頭牛?
記得面向物件的思維方式是首先看有哪些物件,接著看每個物件都應該包含哪些屬性,最後看每個物件應該有哪些方法以及各個物件之間的關係。
從題目就可知道這個問題中有兩個物件,一個是牛,一個是農場。對於牛來說它肯定需要有一個年齡的屬性,對於農場來說他應該包含了一個牛集合。至於方法,牛這邊肯定有一個生小牛的方法和一個長大的方法。對於農場那邊呢,我們需要一個新增方法(把新出生的小牛加到農場裡),最後加一個統計方法(統計下農場上牛的數量)。廢話不多說直接貼程式碼。
這個是牛的類
package com.model; public class Cow { private int age; public Cow(){ this.age=0; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /** * 母牛生小牛方法 * @return */ public Cow bornCow(){ if (age>=5) { return new Cow(); } return null; } /** * 牛長大的方法 */ public void grouth(){ age++; } }
這個是農場的類
package com.model; import java.util.ArrayList; import java.util.List; public class Farm { private int countNum; private List<Cow> cows = new ArrayList<>();; public int getCountNum() { return countNum; } public void setCountNum(int countNum) { this.countNum = countNum; } public List<Cow> getCows() { return cows; } public void setCows(List<Cow> cows) { this.cows = cows; } /** * 增加牧場牛方法 * @param cow */ public void addCows(Cow cow){ if (cow!=null) { cows.add(cow); } } /** * 統計牧場牛的數量 * @param duringYears * @return */ public String getCowNum(int duringYears){ for (int i = 1; i <= duringYears; i++) { System.out.println("第"+i+"年"); for (int j = 0; j < cows.size(); j++) { Cow cow = cows.get(j); cow.grouth(); addCows(cow.bornCow()); } System.out.println("農場有"+cows.size()+"頭牛!"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return "經過"+duringYears+"年後,農場目前總共有"+cows.size()+"頭牛!"; } }
這個是測試方法
package com.test;
import com.model.Cow;
import com.model.Farm;
public class Test {
public static void main(String[] args) {
Farm farm = new Farm();
farm.addCows(new Cow());
System.out.println(farm.getCowNum(20));
}
}