美文网首页
设计模式-观察者模式

设计模式-观察者模式

作者: ZjyMac | 来源:发表于2018-05-07 13:57 被阅读0次

一,观察者模式详解

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

  • 回调模式
    image.png

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

  • Listview中的notifyDataChanged

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

相关文章

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 设计模式02-观察者者设计模式

    [toc] 设计模式02-观察者者设计模式 主要来源Head First设计模式(书)观察者设计模式是JDK中使用...

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava设计模式与原理

    标准观察者设计模式 RxJava是一种特殊的观察者模式,首先我们先来看标准的观察者设计模式。在标准观察者模式中,存...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • Guava源码分析——EventBus

    EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。 1、程序示例...

  • 设计模式之观察者模式

    设计模式之观察者模式 本篇是设计模式系列博客的第四篇,本篇主要学习设计模式中的第二个行为型模式---观察者模式。 ...

  • PHP设计模式之观察者模式

    PHP设计模式之观察者模式

  • Android中涉及的模式

    我的Java设计模式-建造者模式 我的Java设计模式-观察者模式 重学设计模式之单例模式

网友评论

      本文标题:设计模式-观察者模式

      本文链接:https://www.haomeiwen.com/subject/zaescftx.html