定义
观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它大所有依赖者都会收到通知并自动更新。
角色
观察者模式主要包含的角色为抽象观察者,抽象主题,以及它们各自具体的实现。
推模型
推模型是一种主题对象状态发生变化时主动推送信息给所有观察者的模型,无论是否需要,被注册的观察者只能被动地接受改变。
抽象主题
/**
* Created by tiantian on 2018/7/22
*/
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
public void setState(String state);
}
抽象观察者
/**
* desc :抽象观察者
* Created by tiantian on 2018/7/22
*/
public interface Observer {
public void update(String state);
}
具体主题
/**
* desc : 具体主题
* Created by tiantian on 2018/7/22
*/
public class ConcreteSubject implements Subject {
List<Observer> observers;
String state = "state";
public ConcreteSubject() {
this.observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
this.observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int index = observers.indexOf(observer);
observers.remove(index);
}
@Override
public void notifyObservers() {
for(Observer o : observers) {
o.update(this.state);
}
}
@Override
public void setState(String state) {
this.state = state;
}
}
具体观察者
/**
* desc : 具体观察者
* Created by tiantian on 2018/7/22
*/
public class ConcreteObserver implements Observer{
String state = "state";
@Override
public void update(String state) {
this.state = state;
}
}
客户端测试类
public class Client {
public static Subject subject = new ConcreteSubject();
public static void main(String[] args) {
Observer observer = new ConcreteObserver();
subject.registerObserver(observer);
subject.setState("new state");
subject.notifyObservers();
System.out.println(((ConcreteObserver) observer).state);
}
}
在测试中,我们简单的创建了一个主题对象和一个观察者对象,先注册观察者对象。然后通过主题对象的setState方法模拟主题对象的状态改变,调用调用notifyObservers通知所有观察者更新状态。
拉模型
拉模型把数据的控制权转移到了观察者。主题对象状态更新之后依然会发送通知给各位观察者们,但只是简单的告诉它们我更新了。观察者的update的参数列表接收一个主题对象,具体怎么更新自己的数据,各观察者们自己选择。这就是观察者模式的拉模型。
拉模型抽象主题和具体主题
/**
* desc : 抽象主题
* Created by tiantian on 2018/7/22
*/
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
public void setState(String state);
public String getState();
}
/**
* desc : 具体主题
* Created by tiantian on 2018/7/22
*/
public class ConcreteSubject implements Subject {
List<Observer> observers;
String state = "state";
public ConcreteSubject() {
this.observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
this.observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int index = observers.indexOf(observer);
observers.remove(index);
}
@Override
public void notifyObservers() {
for(Observer o : observers) {
o.update(this);
}
}
@Override
public void setState(String state) {
this.state = state;
}
@Override
public String getState() {
return this.state;
}
}
抽象观察者和具体观察者
/**
* desc :抽象观察者
* Created by tiantian on 2018/7/22
*/
public interface Observer {
public void update(Subject subject);
}
/**
* desc : 具体观察者
* Created by tiantian on 2018/7/22
*/
public class ConcreteObserver implements Observer{
String state = "state";
@Override
public void update(Subject subject) {
this.state = subject.getState();
}
}
客户端测试
public class Client {
public static Subject subject = new ConcreteSubject();
public static void main(String[] args) {
Observer observer = new ConcreteObserver();
subject.registerObserver(observer);
subject.setState("New State!");
subject.notifyObservers();
System.out.println(((ConcreteObserver) observer).state);
}
}
// Outout : New State!