觀察監視某個主題的狀態,通知其他監視者。
//主題對象(被觀察的對象)
public class Subject {
//觀察者集合
private List<Observer> observers = new ArrayList<>();
//設置狀態變化的標識
private int state;
//將觀察者加入集合中
public void attach(Observer observer) {
observers.add(observer);
}
public int getState() {
return this.state;
}
public void setState(int state) {
//如果state沒有變化,折返回。
if (state == this.state) {
return;
}
//當state變化時,將state設置爲要改變的值,並通知所有觀察者。
this.state = state;
notifyAllObserver();
}
//通知所有觀察者的方法
private void notifyAllObserver() {
observers.stream().forEach(Observer::update);
}
}
//觀察者接口
public abstract class Observer {
protected Subject subject;
public Observer(Subject subject) {
this.subject = subject;
//調用subject的方法,將觀察者加入到觀察集合中。
this.subject.attach(this);
}
//通知用戶
public abstract void update();
}
//觀察者實現
public class Jun_Observer extends Observer {
public Jun_Observer(Subject subject) {
super(subject);
}
@Override
public void update() {
System.out.println("Jun觀察到主題的state有變化,變爲:" + subject.getState());
}
}
//觀察者實現
public class Soutn_Observer extends Observer{
public Soutn_Observer(Subject subject) {
super(subject);
}
@Override
public void update() {
System.out.println("South觀察到主題的state有變化,變爲:" + subject.getState());
}
}
Test_Main
public static void main(String[] args) {
//創建要觀察的對象
final Subject subject = new Subject();
//創建Jun_Observer觀察者
new Jun_Observer(subject);
//創建Soutn_Observer觀察者
new Soutn_Observer(subject);
subject.setState(100);
subject.setState(200);
subject.setState(300);
}