美文网首页
(12)观察者模式

(12)观察者模式

作者: minminaya | 来源:发表于2017-07-26 20:44 被阅读3次

定义

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。其实就是订阅模式。


使用场景

  • 事件多级触发场景;
  • 关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系;
  • 跨系统的消息交换场景,如消息队列,事件总线的处理机制
  • RxJava,EventBus,ListView的适配器

UML图

观察者模式UML图

优点

  • 观察者和被观察者之间是抽象耦合,应对业务变化
  • 增强系统灵活性,可扩展性

缺点

  • 程序中包含一个被观察者,多个观察者,开发,调试等内容会比较复杂。
  • 耦合度太低(HAHAHAHA尴尬),例如eventbus中有时候可能找不到消息从哪里发到哪里,建议注释上写上消息来源和消息去处
  • java中消息的通知默认执行是顺序执行,一个观察者卡顿,可能会影响整体的速率,(建议采用异步来解决)

例子

DevTechFrontier是一个技术网站,当上面的内容更新时,系统会发邮件给订阅了该网站更新的程序员

  1. 被观察者角色,内容更新时,所有的观察者(程序员)都会收到相应的通知
import java.util.Observable;

/**
 * DevTechFrontier这个网站是被观察者角色,当它的内容更新时,所有的观察者(程序员)都会收到相应的通知
 * Created by Niwa on 2017/7/26.
 */
public class DevTechFrontierObservable extends Observable {

    public void postNewPublication(String content) {
        setChanged();
        notifyObservers(content);
    }


}
  1. 程序员类,观察者,在update()里处理被观察者更新时发出来的内容

import java.util.Observable;
import java.util.Observer;

/**
 * 具体观察者实现类
 * 程序员是观察者
 * Created by Niwa on 2017/7/26.
 */
public class Coder implements Observer {
    private String name;

    public Coder(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Hi," + name + ",DevTechFrontier:" + arg);
    }

    @Override
    public String toString() {
        return "程序员名字:" + name;
    }
}
  1. 测试类,注册被观察者和观察者,发布订阅信息,
/** 客户端类
 * Created by Niwa on 2017/7/26.
 */
public class Client {

    public static void main(String[] arg) {
        //被观察者
        DevTechFrontierObservable devTechFrontier = new DevTechFrontierObservable();

        //观察者
        Coder coder1 = new Coder("minminaya");
        Coder coder2 = new Coder("孙悟空");

        //注册观察者到可观察对象的观察者列表中(订阅)
        devTechFrontier.addObserver(coder1);
        devTechFrontier.addObserver(coder2);

        //发布消息
        devTechFrontier.postNewPublication("我们网站有新的技术分享");
    }
}

结果:

Hi,孙悟空,DevTechFrontier:我们网站有新的技术分享
Hi,minminaya,DevTechFrontier:我们网站有新的技术分享


源代码:DesignPattern


参考

《Android源码设计模式解析与实战读书》
各大佬博客


end

相关文章

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

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

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

    1.什么是观察者模式?2.为什么要用观察者模式?它的优缺点是什么?![Uploading 屏幕快照 2016-12...

  • RxJava基础—观察者模式

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

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

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

  • RxJava 原理篇

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

  • 观察者模式

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

  • 设计模式-观察者模式

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

  • 观察者模式

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

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

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

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

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

网友评论

      本文标题:(12)观察者模式

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