偶然看到了关于这个数学问题,就在想怎么用面向对象的方式解决问题.小弟利用蹩脚的Java语言和刚学到的观察者模式,想到了一个小办法.大家有兴趣看看吧!
原题如下:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序:
// 周期对象,控制时间自动增长,被观察的对象
class Clock extends Observable {
public static Clock clock;
public static int rabbitcount = 0; // 现有兔子数量
public static Clock getInstance() { // 单例模式,大家公用一个时间
if (clock == null) {
clock = new Clock();
}
return clock;
}
public void run() { // 时间开始走动
for (int i = 1; i <= 12; i++) { // 12个月
this.setChanged();
this.notifyObservers(i); // 唤醒观察者
System.out.println("面向对象思想:第" + i + "个月的兔子数量是:" + rabbitcount);
}
}
}
class Rubbit implements Observer { // 兔子(观察者:观察时间)
int birthMoth;
public Rubbit(int birthMoth) { // 初始化兔子的出生时间
this.birthMoth = birthMoth;
}
public void update(Observable o, Object month) {
Integer now = (Integer) month;
if (now - birthMoth >= 2) { // 如果兔子达到三岁就可以生出一对小兔子
Clock.rabbitcount += 1; // 兔子的数量增加一对
Clock.getInstance().addObserver(new Rubbit(now)); // 将小兔子变成观察者,并告诉它自己出生的时间
}
}
}
public class RubbitCount {
// 数学思想
public static void count() {
int f1 = 1;
int f2 = 1;
int f = 0;
int M = 12;
System.out.println("普通数学思想:第1个月的兔子数量是:" + f2);
System.out.println("普通数学思想:第2个月的兔子数量是:" + f2);
for (int i = 3; i <= M; i++) {
f = f2;
f2 = f1 + f2;
f1 = f;
System.out.println("普通数学思想:第" + i + "个月的兔子数量是:" + f2);
}
}
public static void main(String[] args) {
// 面向对象设计思想----------
Clock.getInstance().addObserver(new Rubbit(1));
Clock.rabbitcount += 1;
Clock.getInstance().run();
// 数学思想
count();
}
}
程序结果:
面向对象思想:第1个月的兔子数量是:1
面向对象思想:第2个月的兔子数量是:1
面向对象思想:第3个月的兔子数量是:2
面向对象思想:第4个月的兔子数量是:3
面向对象思想:第5个月的兔子数量是:5
面向对象思想:第6个月的兔子数量是:8
面向对象思想:第7个月的兔子数量是:13
面向对象思想:第8个月的兔子数量是:21
面向对象思想:第9个月的兔子数量是:34
面向对象思想:第10个月的兔子数量是:55
面向对象思想:第11个月的兔子数量是:89
面向对象思想:第12个月的兔子数量是:144
普通数学思想:第1个月的兔子数量是:1
普通数学思想:第2个月的兔子数量是:1
普通数学思想:第3个月的兔子数量是:2
普通数学思想:第4个月的兔子数量是:3
普通数学思想:第5个月的兔子数量是:5
普通数学思想:第6个月的兔子数量是:8
普通数学思想:第7个月的兔子数量是:13
普通数学思想:第8个月的兔子数量是:21
普通数学思想:第9个月的兔子数量是:34
普通数学思想:第10个月的兔子数量是:55
普通数学思想:第11个月的兔子数量是:89
普通数学思想:第12个月的兔子数量是:144
------解决方案--------------------
支持一个(单例没用对哦)