Java设计模式系列之观察者模式

观察者模式 Observer的定义

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

  这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

第一部分

这里有一个例子,是马士兵老师在讲解观察者模式的时候给出的例子,个人认为对理解观察者模式有很大的用处,自己查到的一些博文也写得很好,但是太过于一板一眼了,不便于去理解。具体的例子是这样的:一个小孩在睡觉,当小孩醒过来之后,爸爸要feed,爷爷要哄哄抱抱,小狗汪汪叫。在这里这个睡觉的小孩就是被观察的对象,后面三个对象就是观察者,小孩的状态发生改变的时候,就相当于一个事件被触发了,观察者(或者应该叫做监听者)会做出相应的动作。下面是具体的是代码实现。

第一步:我们定义被观察对象

第二步:给出监听接口,具体的观察者都去实现这个接口,具体的观察者复写接口的performAction方法,小孩的状态发生变化,做出响应

1
2
3
interface WakeUpListener {
    public void performAction(WakeUpEvent wakeUpEvent);
}

第三步:定义具体的观察者

第四步:定义事件类Event,Event事件类,将观察者状态的改变封装成Event类,不同的状态对应不同的事件。在我们的例子中,小孩的状态发生改变,他的观察者Dad、Dog、Grand会针对此事件做出反应;

第五步:下面的observers是我们的配置文件的文件名,尽量将这些动作的实现对客户端隐藏,用户不需要明白加载读取配合文件的操作,在做代码设计的时候要始终坚持这一原则。

我们在这里将读取配置文件的动作封装在类中:

最后一步:测试一下我们的程序,这里我给出完整的代码,方便读者的调试验证(这里附上我们的配置文件Observers.properties),只是一个简单的键值对应关系:observers=Grand,Dog,Dad

运行结果:

1
2
3
..hug..
..汪汪..
..feed..

第二部分

面试的过程可能会问到什么是观察者模式,其实这个时候不要给他们说什么太过于理论性的东西,举例子最方便不过了。观察者模式在java中的运用其实挺多的,比如说AWT和Swing中的监听机制用到的就是观察者模式,下面我们就来模拟一下看看监听机制是如何运作的。【注意】,代码中用到的类和方法都是我们自己定义的,不是调用API中的类和方法。

第一步:给出被监听对象:我们定义的一个按钮button

第二步:定义监听接口,具体的监听者去实现这个接口

1
2
3
interface ActionListener {
    public void actionPerformed(ActionEvent e);
}

第三步:具体的监听者

 在这里我们定义了两个监听者类

第四步:定义监听事件Event,时间对象包括:时间的发生时间when+事件源

第五步:给出测试代码

运行结果:

1
2
button pressed
button pressed2

最后给出完整代码方便理解调试:

第三部分:我们在第二步给出了我们自己模拟的按钮按下触发相应动作的过程,第三部分给出AWT中,调用API中封装的一些已经实现好的类和方法,和第二步完成的是相同的动作。

posted @   菜鸟奋斗史  阅读(1295)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示