观察者模式是一种多对一的关系,即多个观察者对象 观察 一个被观察者对象,当被观察者对象状态发生变化时,能自动通知观察者对象执行相应动作。
观察者模式提供给关联对象的一种同步通信的方式,下面来看结构图(截自 程杰 大化设计模式)
两个角色:
Subject:被观察者,一般为一个抽象类或接口,其中有一个聚集保存所有注册的观察者,一个方法用于通知所有的观察者,Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
Observer: 观察者,抽象类或接口,有一个更新接口,更新自己的状态。
Java的Util中已实现这两个工具, Suject 为 java.util.Observable,查看jdk手册可知主要方法,其中要注意的是 setChanged() 方法,在通知之前必须调用该方法确认状态改变,否则通知不生效。
Observer接口:就一个update()方法。
以下来看例子:被观察者为博主,观察者为粉丝
1、文章类 Article
package com.zewe.observer;
/**
* 文章类
* @author ZeWe
*
*/
public class Article {
private String title;
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String show(){
return "标题:"+title+" , 内容:"+content;
}
}
2、博主类:BlogUser
package com.zewe.observer;
import java.util.Observable;
/**
* 博主
* @author ZeWe
*
*/
public class BlogUser extends Observable{
private String name;
public BlogUser(String name) {
super();
this.name = name;
}
public void publicBlog(String title, String content){
Article art = new Article();
art.setTitle(title);
art.setContent(content);
System.out.println(name +"发表文章, "+art.show());
this.setChanged(); // 发表文章动作确认
this.notifyObservers(art); // 通知所有观察者
}
}
3、粉丝类:Fans
package com.zewe.observer;
import java.util.Observable;
import java.util.Observer;
/**
* 粉丝
* @author ZeWe
*
*/
public class Fans implements Observer{
private String name;
public Fans(String name) {
super();
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
Article art = (Article) arg;
System.out.println("粉丝"+name+"接收通知:"+art.show());
}
}
4、执行方法
package com.zewe.observer;
public class MainTest {
public static void main(String[] args) {
BlogUser zewe = new BlogUser("ZeWe");
Fans xiaoming = new Fans("小明");
Fans tiezhu = new Fans("铁柱");
//粉丝关注
zewe.addObserver(xiaoming);
zewe.addObserver(tiezhu);
zewe.publicBlog("观察者模式", "设计模式学习观察者模式 ......");
}
}
// 结果:
/**
ZeWe发表文章, 标题:观察者模式 , 内容:设计模式学习观察者模式 ......
粉丝铁柱接收通知:标题:观察者模式 , 内容:设计模式学习观察者模式 ......
粉丝小明接收通知:标题:观察者模式 , 内容:设计模式学习观察者模式 ......
**/