自定义观察者模式
1.被观察者
package fengxing.primer.lib.simple;
/**
* 被观察者
* 1.一个观察者对应多个被观察者
*/
public interface Observed {
/**
* 添加观察者
*/
public void addObserver(Observer observer);
/**
* 移除观察者
*/
public void removeObserver(Observer observer);
/**
* 通知所有观察者
*/
public void notifyObserver(String message);
}
2.实现被观察者接口
package fengxing.primer.lib.simple;
import java.util.ArrayList;
import java.util.List;
/**
* 实现被观察者的接口
*/
public class ObservedImpl implements Observed{
/**
* 观察者
*/
private List<Observer> list = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
list.remove(observer);
}
@Override
public void notifyObserver(String message) {
for (Observer observer: list) {
observer.update(message);
}
}
}
3.观察者
package fengxing.primer.lib.simple;
/**
* 观察者
*/
public interface Observer {
public void update(String string);
}
4.实现观察者接口
package fengxing.primer.lib.simple;
/**
* 观察者实现类
*/
public class ObserverImpl implements Observer {
@Override
public void update(String string) {
System.out.println(string);
}
}
5.测试
package fengxing.primer.lib.simple;
public class Test {
public static void main(String[] args) throws Exception{
System.out.println("hello world");
//被观察者
Observed observed = new ObservedImpl();
//观察者
Observer observer1 = new ObserverImpl();
Observer observer2 = new ObserverImpl();
Observer observer3 = new ObserverImpl();
Observer observer4 = new ObserverImpl();
observed.addObserver(observer1);
observed.addObserver(observer2);
observed.addObserver(observer3);
observed.addObserver(observer4);
observed.notifyObserver("亲亲,来呀!");
}
}
Java内部实现的观察者模式
这个就简洁很多,上一个是要让你了解内部大概实现流程
1.被观察者
package rxjava;
import java.util.Observable;
/**
*被观察者
*/
public class RxObservable extends Observable {
private int data = 0;
public int getData() {
return data;
}
public void setData(int data) {
if (this.data!=data) {
this.data = data;
//通知状态发生改变
setChanged();
//通知观察者,数据状态发生改变
notifyObservers();
}
}
}
2.观察者
package rxjava;
import java.util.Observable;
import java.util.Observer;
/**
* 观察者
*/
public class RxObserver implements Observer {
/**
* 被观察者添加一个观察者 (小孩[被观察者]需要一个监护人[观察者])
* @param observable
*/
public RxObserver(RxObservable observable) {
observable.addObserver(this);
}
@Override
public void update(Observable observable, Object o) {
System.out.println("数据变化: "+((RxObservable)observable).getData());
}
}
3.测试
package rxjava;
public class RxText {
public static void main(String[] args) {
RxObservable observable = new RxObservable();
RxObserver observer = new RxObserver(observable);
observable.setData(123);
observable.setData(123);
observable.setData(756);
observable.setData(8976);
}
}