观察者(Observer) 和 被观察者(Observable)
1、被观察者 (Observable)的接口:
a:它需要维护一个观察者的列表,所以一般会有一个list用来存储观察者。
b:它需要对列表进行增删,所以会有两个接口,增加和删除。
c:有变化的时候它需要通知观察者们,所以要有一个通知接口。
接口:
public interface Observable {
void add(Observer observer);
void remove(Observer observer);
void notify(String message);
}
实现:
public class PostMan implements Observable {
private List<Observer> users;
public PostMan() {
this.users = new ArrayList<>();
}
@Override
public void add(Observer observer) {
users.add(observer);
}
@Override
public void remove(Observer observer) {
users.remove(observer);
}
@Override
public void notify(String message) {
for (Observer observer : users) {
observer.update(message);
}
}
}
对于观察者(Observer),它只需要在收到通知时更新自己就行。
接口:
public interface Observer {
void update(String msg);
}
实现:
public class Boy implements Observer {
private String name;
public Boy(String name) {
this.name = name;
}
@Override
public void update(String msg) {
Log.d("Boy", name + "收到消息," + msg);
}
}
最终看效果:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Boy li = new Boy("李明");
Boy wang = new Boy("王思");
Girl shen = new Girl("沈胜");
PostMan zhang = new PostMan();
zhang.add(li);
zhang.add(wang);
zhang.add(shen);
zhang.notify("快递送到了啊");
}
运行结果:
10-11 15:22:35.280 8271-8271/com.example.observertest D/Boy: 李明收到消息,快递送到了啊
10-11 15:22:35.280 8271-8271/com.example.observertest D/Boy: 王思收到消息,快递送到了啊
10-11 15:22:35.280 8271-8271/com.example.observertest D/ Girl: 沈胜收到消息:快递送到了啊
参考: