刚开始学Java的时候,用Swing写桌面程序,经常遇到UI更新回调代码很乱的情况。好在java.util包提供了观察者模式的相关类Observable和Observer。
但是如果是基于Swing的图形程序,在继承了Swing控件的类里怎样再继承Observable呢?
在单继承的Java中,答案是不可能的。
不能继承,就用组合了。
下面以一个JPanel为例
public class ObservablePanel extends JPanel {
// 不能多继承,只能组合。
protected Observable notifier = new Observable();
//其他代码
}
查文档发现,setChanged是个protected的方法,在外部无法调用。
于是,我们就自己来实现一个不这么蠢的Observable吧。
public class NotStupidObservable extends Observable {
@Override
public/*去你个protected*/ synchronized void setChanged() {
// TODO Auto-generated method stub
super.setChanged();
}
}
接下来,把ObservablePanel内的notifier声明为NotStupidObservable:
public class ObservablePanel extends JPanel {
// 不能多继承,只能组合。
protected NotStupidObservable notifier = new NotStupidObservable();
//其他代码
}
好了问题解决了。
新技能get:
1.不能使用继承的地方,可以考虑使用组合。(据说在OOP设计时都是优先组合?)
2.子类继承父类重写方法可以扩大访问权限,但是不能缩小,否则违反迪米特原则。