一 观察者模式
定义:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖会收到通知并自动更新。
UML图:
1.1 Observer 接口
观察接口
提供了updata()方法,供Subject.notifyObservers()调用,具体实现在ObserverObject;
package observer;
/**
* Created by zjy on 2017/3/28.
*/
public interface Observer {
public void update(int data);
}
1.2 Subject接口
package observer;
/**
* Created by zjy on 2017/3/28.
*/
public interface Subject {
public void registerObserver(Observer observer);
public void delectObserver(Observer observer);
public void notifyObservers();
}
1.3 Data
Subject接口具体实现
ArrayList observers维护观察者列表;
package observer;
import java.util.ArrayList;
/**
* Created by zjy on 2017/3/28.
*/
public class Data implements Subject {
ArrayList<Observer> observers;
int data;
public void setData(int data) {
this.data = data;
dataChange();
}
public void dataChange() {
notifyObservers();
}
public Data() {
this.observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void delectObserver(Observer observer) {
int index= observers.indexOf(observer);
observers.remove(index);
}
@Override
public void notifyObservers() {
for (Observer observer:observers){
observer.update(data);
}
}
}
1.4 ObserverObject
Observer接口具体实现
Subject subject维护观察的主题;
package observer;
/**
* Created by zjy on 2017/3/28.
*/
public class ObserverObject implements Observer {
int data;
Subject subject;
@Override
public void update(int data) {
this.data=data;
System.out.println(this+"**data:"+data);
}
public ObserverObject(Subject subject) {
this.subject =subject;
subject.registerObserver(this);
}
}
1.5 测试
package observer;
/**
* Created by zjy on 2017/3/28.
*/
public class Test {
public static void main(String[] args){
Data data = new Data();
ObserverObject observerObject1 = new ObserverObject(data);
ObserverObject observerObject2 = new ObserverObject(data);
data.setData(1);
data.delectObserver(observerObject2);
data.setData(2);
data.registerObserver(observerObject2);
data.setData(3);
}
}
结果:
data为1两个观察者;
注销观察者2,数据改变为2,观察者1收到;
注册观察者2,数据改变为3,观察者1、2均收到;
二 java 观察者模式
UML图:
1.主题类中obs维护观察者列表;
2.public synchronized void addObserver(Observer o) 添加实现Observe接口的类,别的方法类似第一部分
3.Java Observable 是线程安全。
4.没有面向接口编程,Observable是个类
三 Android 中观察者模式
view.OnclickListener(new OnclickListener(){
@Override
public void onClick(@NonNull View v) {
}
});
View 中定义OnclickListener接口;
DeclaredOnClickListener 实现OnclickListener接口中Onclick方法;
performAccessibilityActionInternal方法当action为ACTION_CLICK时通过performClick()方法调用Onclick;