观察者模式:
观察者订阅事件源,当事件源状态发生改变时,自动通知订阅的观察者,并触发观察者预定动作。
事件源:
package com.example.multithread.pattern;
import java.util.ArrayList;
import java.util.List;
/**
* 事件源
*/
public class Subject {
int state;
List<Observer> observerList = new ArrayList<>();
public void attach(Observer observer){
observerList.add(observer);
}
public void detach(Observer observer){
observerList.add(observer);
}
public void notifyAllObserver(int state){
observerList.stream().forEach(i->i.update());
}
public int getState() {
return state;
}
public void setState(int state) {
if(this.state == state){
return;
}
this.state = state;
notifyAllObserver(state);
}
public static void main(String[] args) {
//事件源
Subject subject = new Subject();
//观察者
new BinaryObserverClient(subject);
new OctalObserverClient(subject);
//事件源状态发生改变
System.out.println("==============state = 1");
subject.setState(1);
System.out.println("==============state = 2");
subject.setState(2);
//事件源状态未发生改变,不会触发观察者的动作
System.out.println("==============state = 2");
subject.setState(2);
System.out.println("==============state = 4");
subject.setState(4);
}
}
观察者抽象:
package com.example.multithread.pattern;
/**
* 观察者抽象
*/
public abstract class Observer {
/**
* 事件源
*/
protected Subject subject;
/**
* 事件源发生改变后,观察者的动作
*/
public abstract void update();
}
具体观察者:
package com.example.multithread.pattern;
/**
* 具体的观察者client
*/
public class BinaryObserverClient extends Observer{
public BinaryObserverClient(Subject subject){
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println("now binary state is "+Integer.toBinaryString(subject.state));
}
}
package com.example.multithread.pattern;
/**
* 具体的观察者client
*/
public class OctalObserverClient extends Observer{
public OctalObserverClient(Subject subject){
subject.attach(this);
}
@Override
public void update() {
System.out.println("now octal state is "+Integer.toOctalString(subject.state));
}
}
输出结果如下,可以看到事件源状态发生改变时,自动通知触发了订阅的观察者预定动作。
==============state = 1
now binary state is 1
now octal state is 1
==============state = 2
now binary state is 10
now octal state is 2
==============state = 2
==============state = 4
now binary state is 100
now octal state is 4