利用面向对象解母牛生小牛问题

面向对象的方法解下面的题目:(这是在看马士兵的设计模式的Thinking_in_oo中最后给出的一道题)

题目:

 

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

题目解析:

按照我的理解,农场首先有一头小母牛,当小母牛长到五岁的时候,它就成了老母牛了,然后就可以每年生小母牛了。根据题目意思,母牛五岁的那年就可以生小母牛了,问第20年的时候有多少头牛。(疑问:第20年生的小母牛算不算,也就是说算的是第20年刚开始时之前的母牛个数还是第20年末之前所有母牛个数),我是按第20年年末算。

OO(面向对象分析):

 分析类:

从题目中可以看出有两个类,农场类和母牛类。

 分析类的属性:

农场类:只有一个存储所有母牛的List集合。母牛类:只有一个年龄类,其它类似name的属性在这里不需要。

分析类的方法:

母牛类:addCow()方法,每当农场生了一只小牛,就将这只牛加入到集合中。getCowsNumber()方法,获得农场所有母牛的数量。everyYear()方法,每年牛都需要长一岁,并且大于等于5岁的母牛都要生一头小牛,在这个方法中体现。

具体代码:

 

package com.zyh;



public class Cow {

	private int age;



	public Cow() {

		this.age = 0;

	}



	//五岁后可生产一头小母牛

	public Cow giveBirth() {

		return new Cow();

	}

	//每年年龄都是要增加的

	public void growth() {

		this.age++;

	}

	

	public int getAge() {

		return age;

	}

	public void setAge(int age) {

		this.age = age;

	}

}


package com.zyh;



import java.util.ArrayList;

import java.util.List;



public class Farm {

	// 存放所有的牛

	private List<Cow> cows = new ArrayList<Cow>();



	// 农场里生出里一头母牛,当然要添加到牛群中

	public void addCow(Cow cow) {

		cows.add(cow);

	}

	

	public int getCowsNumber() {

		return cows.size();

	}

	

	//每年牛都要长一岁,并且到年龄了就产小母牛

	public void everyYear() {

		for (int i = 0; i < cows.size(); i++) {

			Cow cow = cows.get(i);

			//每年母牛都要增长一岁

			cow.growth();

			//如果年龄到了,就在该年开始产小母牛

			if (cow.getAge() >= 5) {

				cows.add(cow.giveBirth());

			}

		}

	}

}


package com.zyh;



public class TestCow {

	public static void main(String[] args) {

		int year = 20;

		Farm farm = new Farm();

		// 刚开始,必须有头母牛

		farm.addCow(new Cow());

		// 调用方法计算

		for(int y=1; y<year; y++) {

			farm.everyYear();

			System.out.println("第" + y + "年,共有:" + farm.getCowsNumber());

		}

	}

}

 

执行结果:

利用面向对象解母牛生小牛问题


 

 

 

你可能感兴趣的:(面向对象)