父亲监视小孩睡醒的设计

这个习题,是老师们经常布置的作业习题。我们最近也布置了这个作业,这个可以实现的很简单,完全为了应付作业,直接写个小孩类child和父亲类Father类,然后在Father类中写个线程,去不停的监视小孩的状态。这能实现,但是这好比父亲一直守到小孩的床边看着小孩一样,父亲这时就只能做这一件事了,如果再加个条件的话,比如小孩在不同的时间段醒来,需要的也不同的话,那就麻烦了,比如小孩在上午和下午醒来需要父亲抱,而在中午醒来需要母亲喂奶,那么父亲和母亲都得在床边守着小孩,这样很不合理,可扩展性差。

其实,这道题是意在考我们的设计模式,这道题主要是想考我们一个事件驱动模型,就像AWT的事件模型一样。这里我们可以换一种思维来思考,就是让小孩醒来去通知在监听他的人。这样,父亲和母亲就可以去干别的事了,呵呵!

这里我们可以设计一个事件类WakeEvent,一个监听接口WakeListener,小孩child中添加个添加监听者的方法,这里就要用到接口回调了。

主要思考点就是让小孩醒来去通知监听他的人,我写的一个demo代码,仅供参考:

//事件类: package event; import java.util.Date; public class WakeEvent { private Date time; private Object eventSource;// 事件源 public WakeEvent(Date time, Object eventSource) { this.time = time; this.eventSource = eventSource; } public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } public Object getEventSource() { return eventSource; } public void setEventSource(Object eventSource) { this.eventSource = eventSource; } } 监听接口: package listener; import event.WakeEvent; public interface WakeListener { public void wakeToAction(WakeEvent event); } 小孩类: import java.util.ArrayList; import java.util.Date; import java.util.List; import event.WakeEvent; import listener.WakeListener; public class Child implements Runnable { private List<WakeListener> listener = new ArrayList<WakeListener>(); private void wakeUp() { int size = listener.size(); WakeEvent event = new WakeEvent(new Date(), this); for (int i = 0; i < size; ++i) { listener.get(i).wakeToAction(event); } } public void addListener(WakeListener l) { if (l == null) return; listener.add(l); } public List<WakeListener> getListener() { return listener; } @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } wakeUp(); } } 父亲类: import event.WakeEvent; import listener.WakeListener; public class Father implements WakeListener { @Override public void wakeToAction(WakeEvent event) { if (event.getTime().getHours() < 12 || event.getTime().getHours() > 1) { System.out.println("Father carrying a child,!"); } } } 母亲类: import event.WakeEvent; import listener.WakeListener; public class Mother implements WakeListener { @Override public void wakeToAction(WakeEvent event) { if (event.getTime().getHours() >= 12 && event.getTime().getHours() <= 1) { System.out.println("mother feed"); } } } 测试类: import java.util.Date; public class Test { /** * @param args */ public static void main(String[] args) { Child c = new Child(); c.addListener(new Father()); c.addListener(new Mother()); new Thread(c).start(); } }

如转载请注明出处,谢谢!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值