首页 > Java > 高级篇 > 母牛生小牛问题的面向对象求解
2014
07-10

母牛生小牛问题的面向对象求解

题目的来源是在马士兵的设计模式视频,主要目的是锻炼自己的面向对象思维,为后续学设计模式打下基础。题目如下,要求用面向对象的方法求解。

农场一头老母牛,
每年生头小母牛,
母牛五岁生母牛,
二十年上多少牛?

统一一下题目中几个理解时会出现歧义的地方:

①小母牛出生时算一岁

② 二十年上是指第二十年年初。

设计两个类:Cow类和Farm类

Cow类:包含年龄和所属农场字段,对外提供的方法有growUp(年龄增长)

Farm类:包含农场名和母牛集合两个字段,对外提供的方法主要有init()、addCow()、getCowNum()、getCowNumByYear()等。

类和类之间为聚合关系。

Cow类:

public class Cow {
	private int age;
	private Farm myFarm; //所属农场

	public void setMyFarm(Farm myFarm) {
		this.myFarm = myFarm;
	}

	/**
	 * 	实例化一个母牛对象时,指定年龄
	 */
	public Cow(int age) {
		this.age = age;
	}

	/**
	 * 指定年龄和所属农场,这个一般表示农场上某头母牛生了一头小牛时的情况,此时小母牛的所属农场同生母
	 */
	public Cow(int age,Farm myFarm) {
		this.age = age;
		this.myFarm = myFarm;
	}

	/**
	 * 每过一年长大一岁,如果大于等于5岁,则可以生个宝宝(向所属农场中添加一个Cow对象)
	 */
	public void growUp(){
		if(++age >= 5){
			myFarm.addCow(new Cow(1,myFarm));
		}
	}
}

Farm类:

public class Farm {
	private String name = "";
	private LinkedList<Cow> cows = new LinkedList<Cow>(); //农场中所有母牛的集合

	public Farm(){
		this.name = "未命名";
	}

	public Farm(String name){
		this.name = name;
	}

	//初始化农场(农场刚成立时有几头母牛)
	public void init(Collection<Cow> c){
		cows.addAll(c);
		//将这些母牛的myFarm字段修改为本农场
		for(Cow cow : c){
			cow.setMyFarm(this);
		}
	}

	//向农场添加母牛
	public void addCow(Cow cow){
		cows.add(cow);
	}

	//返回农场当前母牛的头数
	public int getCowsNum(){
		return cows.size();
	}

	//返回农场第y年头上有多少头牛(即第y-1年年底有多少头牛,本方法会修改农场当前cows数据)
	public int getCowsNumByYear(int y){
		int i = 1 ;
		for(;i < y;i++){
			//System.out.println("第 " + i + "年头上有母牛" + getCowsNum() + "头");

			//由于在遍历集合的时候需要修改集合元素,因此改为遍历集合的副本
			for(Cow c : (LinkedList<Cow>)cows.clone()){
				c.growUp();
			}

		}
		//System.out.println("第 " + i + "年头上有母牛" + getCowsNum() + "头");

		return getCowsNum();
	}
}

MainClass类:

public class MainClass {

	public static void main(String[] args) {
		//创建一个母牛的集合initCows,该母牛集合用于初始化农场(农场第一年头上有多少牛)
		Cow cow = new Cow(5);
		ArrayList<Cow> initCows = new ArrayList<Cow>();
		initCows.add(cow);

		//实例化一个农场对象fm,并初始化农场
		Farm fm = new Farm("晨光农场");
		fm.init(initCows);

		//调用农场的getCowsNumByYear得到第20年年初农场的母牛头数
		System.out.println("第20年头上共有 " + fm.getCowsNumByYear(20) + " 头母牛。");

	}

}

留下一个回复

你的email不会被公开。