网络上看到一道JAVA试题:
<!----><!---->
房间里有猫、狗和人,半夜狗和人都睡了。突然猫叫,狗和人同时被猫叫惊醒。请用 java 程序模拟猫叫同时惊醒狗和人。
给出的参考答案如下:
import java.util.Observable; import java.util.Observer; class Cat extends Observable{ /** * 猫叫 */ public void barking(){ super.setChanged(); System.out.println("猫叫"); super.notifyObservers(); } } class Dog implements Observer{ public void update(Observable o, Object arg) { System.out.println("狗惊醒"); } } class Person implements Observer{ public void update(Observable o, Object arg) { System.out.println("人惊醒"); } } public class Foo { public static void main(String[] args) { Cat cat = new Cat(); cat.addObserver(new Dog()); cat.addObserver(new Person()); cat.barking(); } }
代码当中用到了 观察者模式(Observer),啧啧一看,感觉不错。
运行结果:
猫叫 人惊醒 狗惊醒
可能细心的读者已发现,上述 观察者模式(Observer)的运用,真的能达到题目要求吗?
也就是说:猫叫真的能同时惊醒狗和人?
稍作代码调整:
class TireException extends RuntimeException{ private static final long serialVersionUID = 1L; public TireException(String message) { super(message); } } class Person implements Observer{ @Override public void update(Observable o, Object arg) { if( true ) throw new TireException("太疲劳"); System.out.println("人惊醒"); } }
这是你会发现,如果人太疲劳,没有被猫吵醒。狗也醒不来了。
运行结果:
猫叫 Exception in thread "main" TireException: 太疲劳 at Person.update(Foo.java:38) at java.util.Observable.notifyObservers(Unknown Source) at java.util.Observable.notifyObservers(Unknown Source) at Cat.barking(Foo.java:11) at Foo.main(Foo.java:49)
我们不去指责所谓参考答案的正确与否。
我们是否应该想一想,怎么才能正确合理的使用设计模式?