最近在看老马的设计模式的视频,在对于面向对象的理解时。有个问题很能帮助我们理解面向对象,于是乎自己也照着网上的一些实例做了下。问题是这样的——农场有头大母牛,每年生头小母牛,小牛五年后生小母牛,问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));
}
}
以下是运行结果:
九层之台,始于累土
用心 点滴 积累