观察者模式
2022-12-01 本文已影响0人
古早味蛋糕
观察者模式,包括观察者和被观察者。观察者们将自己的需求告知被观察者,被观察者负责通知到观察者。
一、Java自带的观察者
1. Server
Server可以理解为被观察者,用来通知所有的Client。
public class Server extends Observable {
private int time;
public Server(int time) {
this.time = time;
}
public void setTime(int time) {
if (this.time == time) {
setChanged();//一定要标注, 表明有数据变更, 需要通知观察者
notifyObservers(time);
}
}
}
2. Client
Client是观察者,通过实现Observer接口来接收Server发送的通知。
public class Client implements Observer {
private String name;
public Client(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
if (o instanceof Server) {
ToastUtil.showToast(name + "say: time is up!" + arg);
}
}
}
3. 使用方法
Server server = new Server(2019);
Client client1 = new Client("张三");
Client client2 = new Client("李四");
server.addObserver(client1);
server.addObserver(client2);
server.setTime(2018);
server.setTime(2019);
注意,不需要观察者的时候需要移除观察者,例如在onDestroy的时候:
@Override
protected void initDestroy() {
if (server != null) {
server.deleteObservers();
}
}
二、自己实现观察者模式
对于一个被观察者,我们希望在任何地方都能添加观察者,可以使用静态变量的方式简单地实现:
public class MyObservable {
private static Vector<MyObserver> observers = new Vector<>(); //用Vector考虑线程安全
public static void addObserver(MyObserver myObserver) {
observers.add(myObserver);
}
public static void removeObserver(MyObserver myObserver) {
observers.remove(myObserver);
}
public interface MyObserver {
void update(int time);
}
public static void notify(int time) {
for (MyObserver observer : observers) {
observer.update(time);
}
}
}
进行使用:
//创建观察者
MyObservable.MyObserver myObserver = new MyObservable.MyObserver() {
@Override
public void update(int time) {
ToastUtil.showToast("here is myObserver!");
}
};
//将观察者添加到被观察者中
MyObservable.addObserver(myObserver);
//通知
MyObservable.notify(2020);
//移除
@Override
protected void initDestroy(){
if(myObserver!=null){
MyObservable.removeObserver(myObserver);
}
}