定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
角色
- 主题角色(Subject)
把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,在具体主题的内部状态改变时,给所有登记过的观察者发出通知
- 抽象观察者(Observer)
为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。
- 具体观察者(ConcreteObserver)
通过构成把具体的观察者加入到主题容器中,实现具体的更新方法,在得到通知后。
观察者模式结构图
ItEJDe.png观察者模式利弊
例子
- 主题角色,提供保存观察者对象的容器,提供了通知的方法
public class Subject {
List<Observer> observers = new ArrayList();
Integer state;
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update();
}
}
public List<Observer> getObservers() {
return observers;
}
public void setObservers(List<Observer> observers) {
this.observers = observers;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
}
- 抽象观察者,持有主题的引用,提供了抽象的更新方法
public abstract class Observer {
public Subject subject;
public abstract void update();
}
- 具体观察者一,BinaryObserver
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
Integer subjectState = subject.getState();
String binaryStr = Integer.toBinaryString(subjectState);
System.out.println("Binary Observer update ,binary String: " + binaryStr);
}
}
- 具体观察者二,HexObserver
public class HexObserver extends Observer {
public HexObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
Integer state = subject.getState();
String hexStr = Integer.toHexString(state);
System.out.println("HexObserver update,hex String: " + hexStr);
}
}
- 具体观察者三,OctObserver
public class OctObserver extends Observer {
public OctObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
Integer state = subject.getState();
String octStr = Integer.toOctalString(state);
System.out.println("OctObserver update ,oct String : " + octStr);
}
}
- 测试
public class BaseConversionDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new BinaryObserver(subject);
new HexObserver(subject);
new OctObserver(subject);
System.out.println("############ String value :15 ############");
subject.setState(15);
subject.notifyAllObservers();
}
}
-------------------------------------------------
############ String value :15 ############
Binary Observer update ,binary String: 1111
HexObserver update,hex String: f
OctObserver update ,oct String : 17
网友评论