目录
相关文章:
一、详解
1、概念
定义对象间的一种一个对多的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。
- 观察者属于行为型模式。
- 观察者模式又被称作发布/订阅模式。
- 观察者模式主要用来解耦,将被观察者和观察者解耦,让他们之间没有没有依赖或者依赖关系很小。
2、使用场景
- a、一个抽象模型有两个方面,其中一个方面依赖于另一个方面
- b、一个对象的改变将导致一个或多个其他对象也发生改变
- c、需要在系统中创建一个触发链
3、UML结构图分析
4、实际代码分析
/**
* 抽象目标者
*/
public abstract class Subject {
//保存注册的观察者对象
private List<Observer> mObservers = new ArrayList<>();
//注册观察者对象
public void attach(Observer observer){
mObservers.add(observer);
System.out.println("Attached an observer");
}
//注销观察者对象
public void detach(Observer observer){
mObservers.remove(observer);
}
//通知所有的观察者对象
public void notifyObservers(String newState){
for (Observer observer:mObservers){
observer.update(newState);
}
}
}
public interface Observer {
void update(String state);
}
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void change(String newState) {
state = newState;
System.out.println("ConcreteSubject State: " + state);
//状态发生改变时,通知观察者
notifyObservers(state);
}
}
public class ConcreteObserver implements Observer {
//观察者状态
private String observerState;
@Override
public void update(String state) {
//更新观察者状态,让它与目标状态一致
observerState = state;
System.out.println("ConcreteObserver State: " + observerState);
}
}
public class Client {
public static void main(String[] args) {
//创建目标对象
ConcreteSubject concreteSubject = new ConcreteSubject();
//创建观察者对象
Observer observer = new ConcreteObserver();
//将观察者对象注册到目标对象上
concreteSubject.attach(observer);
//改变目标对象的状态
concreteSubject.change("I am changed");
}
}
5、优点
二、在Android中的实际运用
1、回调模式
实现了抽象类/接口的实例 实现了父类的提供的抽象方法后,将该方法交还给父类来处理。
public class Employee {
/**
* 定义回调接口的成员变量
*/
private Callback mCallback;
/**
* 声明回调接口
*/
public interface Callback {
public abstract void work();
}
/**
* 设置回调接口对象成员变量
*/
public void setCallback(Callback callback) {
this.mCallback = callback;
}
/**
* 调用回调接口对象中的方法
*/
public void doWork(){
mCallback.work();
}
}
public class Boss {
private Employee employee;
/**
* 为Employee设置回调函数,在这里定义具体的回调方法
*/
public void setCallback(){
employee.setCallback(new Employee.Callback() {
@Override
public void work() {
System.out.println("Boss work");
}
});
}
}
2、ListView中的notifyDataChanged
3、Rxjava