深入浅出设计模式二——WeatherData设计(观察者模式)实现二
在上文:深入浅出设计模式二——WeatherData设计(观察者模式)实现一
我们利用了自己缩写的Subject和Observer类完成了天气预报系统。
在JAVA API中已有写好的观察者模式供我们使用,本文将利用它们重新写一个天气预报系统。
在java.util包中有两个类可观察者Observable和观察者Observer。分别相当于Subject类和Observer类。
在Observable类中已经实现了addObserver,deleteObserver,notifyObservers方法,需要注意的是notifyObservers调用前需要调用setChanged标志状态改变,如果要清除状态改变标志则调用clearChanged方法。
?
UML图如下:
代码如下:
?
测试类:
package com.lwf.disign.learn.observer.weatherdata2;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;public class SwingObserverExample {JFrame frame;public static void main(String[] args) {SwingObserverExample s = new SwingObserverExample();s.go();}public void go(){frame = new JFrame();JButton button = new JButton("should i do");button.addActionListener(new AngleListener());button.addActionListener(new DeviListener());frame.getContentPane().add(BorderLayout.CENTER,button);frame.setVisible(true);}class AngleListener implements ActionListener{public void actionPerformed(ActionEvent e) {System.out.println("anglelistener");}}class DeviListener implements ActionListener{public void actionPerformed(ActionEvent e) {System.out.println("deviListener");}}}?
按钮通过addActionListener把每个观察者加入观察列表。一旦状态发生改变,则触发事件。
?