美高梅平台下载-美高梅娱乐平台登录

热门关键词: 美高梅平台下载,美高梅娱乐平台登录

Android 架构师之路 目录,GUI 系统来说

日期:2019-09-30编辑作者:美高梅平台下载

在日常开发过程中时常需要用到设计模式,但是设计模式有23种,如何将这些设计模式了然于胸并且能在实际开发过程中应用得得心应手呢?和我一起跟着《Android源码设计模式解析与实战》一书边学边应用吧!

  • Android 设计模式之面向对象的六大原则
  • Android 设计模式之单例模式
  • Android 设计模式之Builder模式
  • Android 设计模式之代理模式
  • Android 设计模式之装饰模式
  • Android 设计模式之外观模式
  • Android 设计模式之原型模式
  • Android 设计模式之工厂方法模式
  • Android 设计模式之策略模式
  • Android 设计模式之适配器模式
  • Android 设计模式之桥接模式
  • Android 设计模式之状态模式

Android 架构师之路 目录

介绍

观察者模式是一个使用率非常高的模式,它最常用的地方是 GUI 系统,订阅 - 发布系统。因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得他们之间的依赖性更小,甚至做到毫无依赖。以 GUI 系统来说,应用的 UI 具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面会经常性修改,但是业务逻辑基本变化不大,此时,GUI 系统需要一套机制来应对这种情况,使得 UI 层与具体的业务逻辑解耦,可以使用观察者模式。

定义

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

1、观察者模式概念

定义

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

Subject 抽象主题,也就是被观察 (Observable) 的角色,把所有观察者的引用保存到一个集合里,并提供一个接口,可以增加和删除集合中的观察者对象

ConcreteSubject 具体主题,也就是具体被观察者,具体主题内部状态发送改变时,给所有注册过的观察者发出通知

Observer 观察者,是观察者的抽象类,定义了一个接口,使得在得到主题的更改通知时更新自己

ConcreteObserver 具体观察者,该角色实现了抽象观察者所定义的更新接口

ObserverObservable 是 JDK 中的内置类型。

Observer 接口中定义了 update 抽象方法,当 Observable 中有变化时会调用 notifyObservers 方法通知所有的观察者更新。

使用场景

  • 关联行为场景
  • 事件多级触发场景
  • 跨系统的信息交换场景,如消息队列、事件总线的处理机制
1.1 介绍

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

Android 源码中的观察者模式

使用例子

  • 常见的发布-订阅模式
  • ListView的Adapter的notifyDataSetChanged更新方法
  • BroadcastReceiver
  • 开源库EventBus
  • RxJava
1.2 定义

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

Adapter 中的观察者模式

BaseAdapter 是一个观察者模式!!!

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public boolean hasStableIds() {
        return false;
    }

    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }

    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }
}
  1. AdapterView 中有一个内部类 AdapterDataSetObserver,在 ListView 中设置 Adapter 时会构建其一个内部类 AdapterDataSetObserver 的对象,该类继承自 AdapterView 的 AdapterDataSetObserver,也就是一个观察者。

  2. 接着将 AdapterDataSetObserver 对象注册到 Adapter 中,Adapter 类中有一个数据集可观察者 DataSetObservable 对象,在注册时,将 AdapterDataSetObserver 放入到 DataSetObservable 内部的一个 List 集合 mObservers 中

  3. 当数据数量发生变更时,开发者手动调用 Adapter 的 notifyDataSetChanged 方法时,会调用 DataSetObserver 的 notifyChanged 方法,notityChanged 方法中则会遍历其内部的 mObservers 集合中的所有 AdapterDataSetObserver 对象,并调用其 onChanged 方法

  4. AdapterDataSetObserver 也就是观察者对象,在 AdapterView 的内部类 AdapterDataSetObserver 的 onChanged 方法中会调用 requestLayout 方法重新进行布局,更新用户界面

AdapterView 中的 AdapterDataSetObserver 为观察者,Adapter 中的 DataSetObservable 为被观察者,当注册时将与 AdapterView 中的 AdapterDataSetObserver 对象注册到 Adapter 的 DataSetObservable 中。在数据发生变化是,通过 DataSetObservable 来通知 AdapterDataSetObserver 最后通知到 AdapterView 重新布局,完成界面刷新

实现

  • 抽象主题,也就是被观察者(Observable),抽象主题把所有的观察者对象的引用保存在一个集合里,每个主题可以有任意数量的观察者,抽象主题提供接口,可以增加和删除观察者对象
  • 具体的主题,也就是抽象主题的子类,该角色将有关状态存入具体观察者对象,在具体主题内部状态发生改变时,通知所有注册过的观察者
  • 抽象观察者,观察者的抽象类,定义了一个更新的接口
  • 具体的观察者,实现了抽象观察者的更新接口,在被观察者状态发生变化时更新自身的状态
  • 美高梅娱乐平台登录,实现的要点在于把握好以上四个角色
  • 设计模式是一种思想,在应用过程中可以根据具体的需要来实现。RxJava和ListView的Adapter都用到了观察者模式,但实现上肯定会有不一样
美高梅平台下载,1.3 使用场景
  • 当一个对象的数据更新时需要通知其他对象,但这个对象又不希望和被通知的那些对象形成紧耦合。

  • 当一个对象的数据更新时,这个对象需要让其他对象也各自更新自己的数据,但这个对象不知道具体有多少对象需要更新数据。

BroadcastReceiver 中的观察者模式

BroadcastReceiver 是 Android 四大组件之一,它作为应用内、进程间的一种重要通信手段,能够将某个消息通过广播的形式传递给对应的广播接收器对象。接收对象需要通过 Context 的 registerReceiver 方法注册到 AMS 中,当通过 sendBroadcast 发送广播时,所以注册了对应 IntentFilter 的 BroadcastReceiver 对象就会接收到这个消息,BroadcastReceiver 的 onReceive 方法就会被调用,这就是一个典型的 发布--订阅 模式,也就是我们的观察者模式。

实现方式

  • JDK中有Observable类和Observer接口
  • 观察者实现Observer接口,被观察者继承Observable类
  • 被观察者通过Observable类的addObserver方法添加观察者
public class MyObserver implements Observer{ private String mName; public MyObserver(String name) { mName = name; } @Override public void update(Observable o, Object arg) { System.out.println(mName + "-->" + "update: " + arg); }}
  • Observer接口就一个update方法,Observable表示被观察者,Object表示被观察者更新的东西
public class MyObservable extends Observable{ public void sendChangeMeg(String content) { //方法继承自Observable,标示状态或是内容发生改变 setChanged(); //方法继承自Observable,通知所有观察者,最后会调用每个Observer的update方法 notifyObservers; }}
  • 被观察者通过setChanged()方法标示改变,通过notifyObservers方法通知所有观察者
  • notifyObservers方法会遍历所有的观察者Observer,并调用它们的update方法
  • notifyObservers方法中的参数就是最后传到观察者update方法的参数Object arg
public class ObserverPatternTest { @Test public void test1() throws Exception { MyObservable myObservable = new MyObservable(); MyObserver myObserver1 = new MyObserver("observer-1"); MyObserver myObserver2 = new MyObserver("observer-2"); myObservable.addObserver(myObserver1); myObservable.addObserver(myObserver2); //发布消息 myObservable.sendChangeMeg; }}

美高梅娱乐平台登录 1观察者模式测试结果

  • 不知道大家看到上面的测试结果有没有什么疑问,细心的小伙伴可能会发现我们添加观察者的时候顺序是myObserver1、myObserver2,但是结果输出确是先myObserver2再myObserver1,为啥?

2、观察者模式UML类图

美高梅娱乐平台登录 2

观察者模式UML类图

优点

  1. 观察者和被观察者之间抽象耦合,应对业务变化

  2. 增强系统灵活性、可扩展性

本文由美高梅平台下载发布于美高梅平台下载,转载请注明出处:Android 架构师之路 目录,GUI 系统来说

关键词:

注解处理器,接下我们将学习使用APT

主目录见:Android高级进阶知识我们在开发的时候为了提高效率往往会选择一个基于注解的框架,但是有时使用反射通...

详细>>

任何一个包含n个节点完全二叉树(满足从根节点开

一直以来,我都很少使用也避免使用到树和图,总觉得它们神秘而又复杂,但是树在一些运算和查找中也不可避免的要...

详细>>

实现方法,真正调用的构造

参考:Android中定时器的3种实现方法 在Android开发中,定时器一般有以下3种实现方法: 总结 Handler类的主要作用是发送...

详细>>

去看了下Android,可以获取到完整的WiFi列表

在Android6.0调用getScanResults返回空列表,很多朋友都遇到过,解决方法也都有说明,就不再重复了,下面是官方的说明...

详细>>