面向对象设计题:“农场一头小母牛,每年生头小母牛。。。”的一种实现

最近在学习设计模式方面的知识,正好看到一道面向对象的设计题:农场一头小母牛,每年生头小母牛,母牛五岁产母牛,二十年上多少牛?”马士兵大呼好诗啊!这道题的解答正好体现了java中面向对象的设计思想。以下是我的实现。

按照由名词划分类的基本原则,可以将诗中的小母牛和农场作为两个类。小母牛自身有年龄的属性,并能够长大和生小母牛。农场则具有总共有多少头小母牛的属性,并能够不停地增长数量。以下是小母牛(LittleCow)类的代码:

public class LittleCow {
	private int age = 0; // 小母牛的年龄
	
	/**
	 * 公共的构造函数
	 * @param age 
	 */
	public LittleCow(int age) {
		this.age = age;
	}
	
	/**
	 * 为变量提供getters和setters
	 * @return
	 */
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}	
	
	/**
	 * 小母牛每年长一岁,当大于5岁时每年还会生下一头小母牛
	 * @param f 农场对象
	 */
	public void growUp(Farm f) {
		age++;
		if(age > 5) {
			f.add(new LittleCow(0));
System.out.println("age is:" + age);			
		}
	}
}

接着是农场(Farm)类的代码:

import java.util.ArrayList;

public class Farm {
	private int count = 1; // 农场中小母牛的数量
	private ArrayList<LittleCow> littleCows = null; // 小母牛的集合
	
	/**
	 * 为两个私有实例变量设置getters和setters
	 * @return
	 */
	public int getCount() {
		return littleCows.size();
	}
	public void setCount(int count) {
		this.count = count;
	}
	
	public ArrayList<LittleCow> getLittleCows() {
		return littleCows;
	}
	public void setLittleCows(ArrayList<LittleCow> littleCows) {
		this.littleCows = littleCows;
	}
	
	/**
	 * 添加小母牛到集合中
	 * @param littleCow 小母牛对象
	 */
	public void add(LittleCow littleCow) {
		littleCows.add(littleCow);
	}
	
	/**
	 * 在所规定的年数内农场小母牛的增长情况
	 * @param time 所设定的年数
	 */
	public void increase(int time) {
		for(int i=0; i<time; i++) {
			int j = getCount();
			for(int k=0; k<j; k++) {
				LittleCow lc = littleCows.get(k);
				lc.growUp(this);
			}
		}
	}
}

最后进行测试:

import java.util.ArrayList;

public class Test {
	private static int count = 0;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Farm f = new Farm();
		ArrayList<LittleCow> cows = new ArrayList<LittleCow>();
		cows.add(new LittleCow(0)); // 添加原有的第一头小母牛
		f.setLittleCows(cows);
		f.increase(20); // 设置年数为20
		count = f.getCount();
		System.out.println("the total number is:" + count);
	}

}
得到的结果为小母牛总数为71,将这个问题不看成一个算法题,而看成一个面向对象的设计,思路清晰易懂且不容易出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值