美文网首页
观察者模式

观察者模式

作者: BigBigArvin | 来源:发表于2017-05-11 14:36 被阅读7次

什么是观察者模式?
对象之间的一对一或者一对多的依赖,当一个主题对象发生改变的时候,它的所有依赖者都会收到通知。
直接看这个定义可能看了也是有点不明白什么是观察者模式,那我们用几个生活中的例子来说明下:
大家手机上都用过视频软件吧?当大家有喜欢的电视剧追的时候是不是又一个功能叫订阅?这个其实就是一种观察着模式,当用户点击订阅按钮时就相当于和这个电视剧产生了依赖关系,每当电视有更新的时候就会发通知给你告诉你有新的你就会去看。而像这样的例子生活中有很多,就不一一列举了。二java作为一门面相对象语言,所以很多地方用到了观察者模式,例如android系统本身的广播机制就采用了这种模式,还有如消息的推送也是采用的观察者模式。
那观察着模式具实现方式是怎么样的?接下来我们看看观察者模式的类图

57933ddee4b06834741ab1b7.png

Subject : 主题对象的接口,定义了注册,接触注册以及通知等方法

ProgramConcreteSubject :具体的主题对象,所有的观察者对象都在这里被维护,当其本身发生变化时会通知所有观察者

Observer:观察者接口 ,定义了一个接受主题对象状态变化的接口

PersonObserver:具体观察者对象,维护一个对ProgramConcreteSubject的引用,实现Observer接口,通过update()方法接收主题对象的通知。

所以通过上面的介绍几本了解了其结构,接下来看下具体的代码:

Subject

package demo.arvin.com.androiddemo.observer;

/**
 * Created by arvin on 16/7/23.
 */
public interface Subject {
    void notifyAllPerson();
    void registerObServer(Observer observe);
    void unRegisterObServer(Observer observe);
}

ProgramConcreteSubject


package demo.arvin.com.androiddemo.observer;

import java.util.ArrayList;

/**
 * Created by arvin on 16/7/23.
 */
public class ProgramConcreteSubject implements Subject {

    ArrayList<Observer> observerArrayList = new ArrayList<Observer>();
    String name ="";
    @Override
    public void notifyAllPerson() {

        for(Observer observer:observerArrayList){
            observer.updateNewProgrm(name);
        }
    }

    @Override
    public void registerObServer(Observer observer) {

        if(observer != null){
            observerArrayList.add(observer);
        }

    }

    @Override
    public void unRegisterObServer(Observer observer) {

        if(observer != null){
            observerArrayList.remove(observer);
        }

    }

    public void newProgramName(String name){

        this.name = name;
        notifyAllPerson();
    }
}

Observer

public interface Observer {
    void updateNewProgrm(String name);
}

PersonObserver

package demo.arvin.com.androiddemo.observer;
/**
 * Created by arvin on 16/7/23.
 */
public class PersonObserver implements Observer {
    @Override
    public void updateNewProgrm(String name) {

        System.out.println("有新的节目:"+name);

    }
}

调用

public static void main(String[] args) {
        ProgramConcreteSubject subject = new ProgramConcreteSubject();
        PersonObserver observer1 = new PersonObserver();
        PersonObserver observer2 = new PersonObserver();
        subject.registerObServer(observer1);
        subject.registerObServer(observer2);
        subject.newProgramName("CCTV");
    }

面就是观察者模式的具体用法,其实不难,但是在实际过程中我们需要判断什么时候需要使用它,主要是当项目中某个对象状态改变而其它某些对象不要根据这个状态做相应的工作就可以用这个模式,那为什么不用其它模式了,其实最大的优点在于,现在的项目由于功能越来越多,很多项目的业务逻辑绑定太紧,造成项目的维护成本高,扩展性不强,而观察模式Subject和Observer之间是松偶合的,分别可以各自独立改变,是项目更容易扩展。

相关文章

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

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

  • RxJava基础—观察者模式

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

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

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

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

      本文标题:观察者模式

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