设计模式-观察者模式

一,观察者模式详解

  • 概念
    定义对象之间的一种一对多的依赖关系,使得每当一个对象状态改变,相关依赖的对象都会得到通知并被自动更新。
  • 使用场景
    (1)一个抽象模型,有两个方面,其中一个方面依赖另外一个方面。
    (2)一个对象的改变,导致一个或多个对象发生改变
    (3)需要在系统中创建一个触发链
  • UML
设计模式-观察者模式_第1张图片
image.png
  • 代码示例
  • 第一种写法
public interface Oberver {
    void update(String newState);
}
public abstract class Subject {
    //保存观察者对象
    private List obervers = new ArrayList<>();

    public void attach(Oberver oberver) {
        obervers.add(oberver);

    }

    public void detach(Oberver oberver) {
        obervers.remove(oberver);
    }
    //通知所有注册观察者对象
    public void notifyObservers(String newState){
        for (Oberver observer:obervers){
            observer.update(newState);
        }

    }
}
public class ConcreteObserver implements Oberver {
    private String observerState;
    @Override
    public void update(String newState) {
        observerState=newState;
    }
}
public class ConcreteSubject extends Subject{
    private String state;
    public String getState(){
        return state;
    }
    public void change(String newState){
        state=newState;
        notifyObservers(state);
    }

}

  ConcreteSubject concreteSubject = new ConcreteSubject();
        Oberver oberver = new ConcreteObserver();
        concreteSubject.attach(oberver);
        concreteSubject.change("I change");
  • 第二种写法(java提供的类)
public class TargetObserver implements Observer {
    private String name;//观察者名称

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        ((TargetObservable) o).getNewState();
    }
}
public class TargetObservable extends Observable {
    private String newState;

    public String getNewState() {
        return newState;
    }

    public void setNewState(String newState) {
        this.newState = newState;
        this.setChanged();
        this.notifyObservers(newState);
    }
}
  TargetObservable targetObservable=new TargetObservable();
        TargetObserver targetObserver=new TargetObserver();
        targetObservable.addObserver(targetObserver);
        targetObservable.setNewState("hello");

···
TargetObservable targetObservable = new TargetObservable();
TargetObserver targetObserver = new TargetObserver();
targetObservable.addObserver(targetObserver);
targetObservable.setNewState("hello");
···

  • 两种写法区别
    (1)java中用的不是list而是Vector
    原因是 线程安全
    (2)Vector是否有替代品
    有 CopyOnWriteArrayList也是线程安全的

二,android中的实际应用

  • 回调模式
    设计模式-观察者模式_第2张图片
    image.png

Button为被观察者,onClickListener为观察者

  • Listview中的notifyDataChanged

  • Rxjava中的观察者模式的运用

你可能感兴趣的:(设计模式-观察者模式)