安卓系列之设计模式:观察者模式

96 阅读2分钟

定义

对象之间存在一对多关系,让多个观察者对象同时监听某一个对象,当这个对象发生变化时,他的所有观察对象都收到通知并更新,这种模式属于行为型模式。

应用场景

当更改一个对象的状态可能需要更改其他对象,而且要考虑到易用和低耦合,保证高度的协作。

优点

  1. 符合开闭原则
  2. 观察者和被观察者是抽象耦合的

缺点

  1. 被观察者不知道观察者是否接收到消息
  2. 若观察者也是其他观察者的被观察者,那么易造成死循环或者通知耗时

代码实现

被观察者

package com.elaine.testpattern.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 被观察者
 * <p>
 * author: elaine
 * date: 2021/4/21
 */
public class Subject {
    private final List<Observer> observerList = new ArrayList<>();
    private int data;

    public int getData() {
        return data;
    }

    /**
     * 设置数据,且通知观察者更新数据
     *
     * @param data 数据
     */
    public void setData(int data) {
        this.data = data;
        notifyObservers();
    }

    /**
     * 添加观察者到列表
     *
     * @param observer 观察者
     */
    public void attach(Observer observer) {
        observerList.add(observer);
    }

    /**
     * 循环通知观察者更新数据
     */
    public void notifyObservers() {
        for (Observer observer : observerList) {
            observer.updateData();
        }
    }
}

观察者抽象方法

package com.elaine.testpattern.observer;

/**
 * 观察者抽象方法
 * 
 * author: elaine
 * date: 2021/4/21
 */
public abstract class Observer {
    protected Subject subject;

    public abstract void updateData();
}

A 观察者

package com.elaine.testpattern.observer;

import android.util.Log;

/**
 * A观察者
 * author: elaine
 * date: 2021/4/21
 */
public class AObserver extends Observer {

    public AObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void updateData() {
        Log.e("data===更新了数据""A data==" + subject.getData());
    }
}

B 观察者

package com.elaine.testpattern.observer;

import android.util.Log;

/**
 * B观察者
 * author: elaine
 * date: 2021/4/21
 */
public class BObserver extends Observer {

    public BObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void updateData() {
        Log.e("data===新了数据""B data==" + subject.getData());
    }
}

运行代码

private void use() {
    Subject subject = new Subject();
    new AObserver(subject);
    new BObserver(subject);

    Log.e("data===", "old data is 15");
    subject.setData(15);
    Log.e("data===", "new data is 35");
    subject.setData(35);
}

运行结果

被观察者发生变化后,A和B观察者也随着发生变化。

图片

若帅哥美女对该系列文章感兴趣,可微信搜索公众号(木子闲集)关注更多更新文章哦,谢谢~