简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
观察者模式的结构
观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。
问答题
第一题、我和妹妹跟妈妈说:“妈妈,我和妹妹在院子里玩;饭做好了叫我们一声。”请问这是什么模式?能否给出类图说明?
问答题答案
第一题答案、这是观察者模式。我和妹妹让妈妈告诉我们饭做好了,这样我们就可以来吃饭了。换用较为技术化的语言来说,当系统的主题(饭)发生变化时,就告诉系统的其它部份(观察者们,也就是妈妈、我和妹妹),使其可以调整内部状态(有开始吃饭的准备),并采取相应的行动(吃饭)。
系统的类图说明如下。
第一个 public interface RandomNumberListener {//接口 public void numberChanged(double d); } 第二个 public class Consol implements RandomNumberListener{ @Override public void numberChanged(double d) { System.out.println(d); } } 第三个 public class SwingWindow extends JFrame implements RandomNumberListener{//观察者 private JLabel label = new JLabel(); public SwingWindow(){ this.getContentPane().add( label); this.setSize(300,200); this.setVisible(true); } @Override public void numberChanged(double d) { label.setText(String.valueOf(d)); } } 第四个 public class RandomNumber {//业务 private double r; private List<RandomNumberListener> listeners = new ArrayList<RandomNumberListener>(); //添加所有观察者 public void addRandomNumberListener(RandomNumberListener lis){ listeners.add(lis); } public void random(){ r = Math.random(); //数据发生改变,通知所有的观察者 for (RandomNumberListener lis : listeners) { lis.numberChanged(r); } } } 第五个 public class Test { public static void main(String[] args) throws InterruptedException{ RandomNumber rn = new RandomNumber(); SwingWindow sw = new SwingWindow(); Consol c = new Consol(); rn.addRandomNumberListener(sw); rn.addRandomNumberListener(c); while(true){ rn.random(); Thread.sleep(new Random().nextInt(3000)+1000L); } } }