网络上看到一道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)
我们不去指责所谓参考答案的正确与否。
我们是否应该想一想,怎么才能正确合理的使用设计模式?