一、定义
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使得他们能够自动更新自己。
二、结构图
三、代码示例
1、测试观察者模式Action.java
/**
* 测试观察者模式(发布-订阅模式)
* @author lattice
*
*/
public class Action {
public static void main(String[] args) {
ConcreteSubject subject=new ConcreteSubject();
subject.attach(new ConcreteObserver(subject, "lattice"));
subject.attach(new ConcreteObserver(subject, "Peter"));
subject.attach(new ConcreteObserver(subject, "Marry"));
subject.setSubjectState("写博客");
subject.notifyObserver();
}
/**
* 输出结果:
被观察者lattice的状态是:写博客
被观察者Peter的状态是:写博客
被观察者Marry的状态是:写博客
*/
}
2、观察者模式类Subject.java
import java.util.ArrayList;
import java.util.List;
/**
* 抽象通知者
*
* @author lattice
*
*/
public abstract class Subject {
List<Observer> observerList = new ArrayList<Observer>();
/**
* 增加观察者
*
* @param observer
*/
public void attach(Observer observer) {
observerList.add(observer);
}
/**
* 移除观察者
*
* @param observer
*/
public void detach(Observer observer) {
observerList.remove(observer);
}
/**
* 更新被观察者的状态
*/
public void notifyObserver() {
for (Observer observer : observerList) {
observer.update();
}
}
}
/**
* 具体通知者类
*
* @author lattice
*
*/
class ConcreteSubject extends Subject {
private String subjectState;// 被观察者状态
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
public String getSubjectState() {
return this.subjectState;
}
}
/**
* 观察者抽象类
*
* @author lattice
*
*/
abstract class Observer {
public abstract void update();
}
/*
* 具体的观察者类
*/
class ConcreteObserver extends Observer {
private String name;
private String subjectState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject, String name) {
this.name = name;
this.subject = subject;
}
public void setSubject(ConcreteSubject subject) {
this.subject = subject;
}
public ConcreteSubject getSubject() {
return this.subject;
}
@Override
public void update() {
this.subjectState = this.subject.getSubjectState();
System.out.println("被观察者"+this.name+"的状态是:" + this.subjectState);
}
}