GoF阐述:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下:
1, 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操作)
2, 观察者(具体执行操作的对象,有多个)
举例说明:在快乐男生比赛过程其实就是观察者的一个体现,可以这样说吉杰是一个被观察者,而杨二,包小柏,还有巫启贤就是3个观察者,被观察者操作(唱歌)时,观察者们就开始操作(评分),被观察者唱歌就是通知观察者们进行评分。
代码样例:
被观察对象:需要完成三件事情,添加观察者、删除观察者、通知观察者
Observed.java
- package com.alibaba.designpattern.observer;
- public interface Observed {
- void addObserver(Viewer observer);
- void removeObserver(Viewer observer);
- void notifyObservers(Message message);
- }
ConcreteObserved.java
- package com.alibaba.designpattern.observer;
- import java.util.ArrayList;
- import java.util.List;
- public class ConcreteObserved implements Observed{
- private List<Viewer> viewers = new ArrayList<Viewer>(); //存在问题:无序,应该使用set
- @Override
- public void addObserver(Viewer observer) {
- viewers.add(observer); //存在问题:1、未判断observer是否为空,2、该方法未同步,多线程下存在问题
- }
- @Override
- public void notifyObservers(Message message) {
- for(Viewer viewer : viewers){
- viewer.getMessage(message);
- }
- }
- @Override
- public void removeObserver(Viewer observer) {
- viewers.remove(observer); //存在问题:1、未判断observer是否为空,2、该方法未同步,多线程下存在问题
- }
- }
观察者:取得被观察对象的通知信息
Viewer.java
- public interface Viewer {
- void getMessage(Message message);
- }
ConcreteViewer.java
- package com.alibaba.designpattern.observer;
- public class ConcreteViewer implements Viewer {
- @Override
- public void getMessage(Message message) {
- System.out.println(message.getSubject() + "\t" + message.getBody()
- + "\t" + message.getVerify());
- }
- }
通知信息:被观察的内容的封装
Message.java
- package com.alibaba.designpattern.observer;
- import java.io.Serializable;
- public interface Message extends Serializable {
- Object getSubject();
- Object getBody();
- Object getVerify();
- }
TextMessage.java
- package com.alibaba.designpattern.observer;
- public class TextMessage implements Message {
- private String subject;
- private String body;
- private String verify;
- private static final long serialVersionUID = -542794246119749159L;
- public TextMessage(String subject) {
- super();
- this.subject = subject;
- }
- public TextMessage(String subject, String body, String verify) {
- super();
- this.subject = subject;
- this.body = body;
- this.verify = verify;
- }
- @Override
- public String getBody() {
- return this.body;
- }
- @Override
- public String getSubject() {
- return this.subject;
- }
- @Override
- public String getVerify() {
- return this.verify;
- }
- }
单元测试
- @Test
- public void testNotifyObservers() {
- Observed observed = new ConcreteObserved();
- Viewer viewer1 = new ConcreteViewer();
- Viewer viewer2 = new ConcreteViewer();
- Viewer viewer3 = new ConcreteViewer();
- observed.addObserver(viewer1);
- observed.addObserver(viewer2);
- observed.addObserver(viewer3);
- observed.notifyObservers(new TextMessage("开会","年中技术大会","andy"));
- observed.removeObserver(viewer1);
- observed.notifyObservers(new TextMessage("开会","部门大会","keju"));
- }
- 运行结果
- 开会 年中技术大会 andy
- 开会 年中技术大会 andy
- 开会 年中技术大会 andy
- 开会 部门大会 keju
- 开会 部门大会 keju
本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/530451,如需转载请自行联系原作者