Android设计模式之 观察者模式

观察者模式是Android众多设计模式中很重要的一种设计模式,在我们平时开发中经常碰到这种模式,简单的来说,这种设计模式就是信息推送的形式,类似我们生活中的报社和订阅者之间的关系,一旦报纸有更新订阅者就会受到相关的信息。

案例: 在我们开发过程中经常用到ListView,也经常会需要用到ListView的adapter.notifyDataSetChanged()来更新,其实这就是观察者模式的典型应用,可以看下它其中的原理:
下面这段代码是对adapter进行设置提醒有改变则进行通知,相比大家这个方法屡试不爽,我们点进去查看这个方法
这里写图片描述


查看注释我们看到,通知附属的观察者数据已经发生改变,需要进行刷新数据,在点进去notifyChanged()这个方法中
这里写图片描述


通过查看这个方法的说明,我们可以了解,这个方法意思是在说通知每一个观察者内容数据已经发生了改变,从下面的源码也可以看出来,下面是一个for循环,遍历已经注册过的观察者,调用每个观察者的onChanged()方法。
这里写图片描述

以上是Android 自带的ListView内部的一种观察者模式

自定义的观察者模式


1,定义一个被观察者的主题接口
public interface Subject {
//注册观察者
    void addObserver(MyObserver obj);
//反注册观察者
    void deleteObserver(MyObserver obj);
//通知观察者
    void notifyObserver();
}
2,定义一个观察者的接口
public interface MyObserver {

    public void update(String info);
}
3,定义一个具体的被观察者的对象
import java.util.ArrayList;
import java.util.List;


public class TeacherSubject implements Subject{
    //用来保存观察者信息
    private List<MyObserver> observers = new ArrayList<>();
    //用来记录信息
    private String info;



    @Override
    public void addObserver(MyObserver obj) {

        if (!observers.contains(obj)) {
            observers.add(obj);
        }
    }

    @Override
    public void deleteObserver(MyObserver obj) {
        observers.remove(obj);
    }

    @Override
    public void notifyObserver() {
        for (int i = 0; i <observers.size(); i++) {
            MyObserver  observer = (MyObserver)observers.get(i);
            observer.update(info);
        }

    }
    //广播的接口,当调用了这个方法后,就会遍历集合中的每一个观察者的update方法,并且传递过去相关的信息
    public void setHomework(String info) {
        this.info = info;
        System.out.println("传过来的信息为:"+info);
        this.notifyObserver();
    }

}
3,定义一个具体的观察者的对象
public class StudentObserver implements MyObserver{
    private TeacherSubject t;

    //姓名
    private String name;

    //构造函数同时注册
    public StudentObserver(String name1, TeacherSubject t1)
    {
        t=t1;
        name = name1;
        //这个对象生成的时候就注册,保存到集合当中去
        t.addObserver(this);
    }
    //每次有信息过来就是遍历然后调用这个方法
    @Override
    public void update(String info) {
        System.out.println(name+ "得到的消息为:"+info);
    }


}

测试主函数
这里写图片描述


不知道上面的介绍有没有讲明白,我想在这里补充一下,之前我第一次接触的时候也很不明白观察者模式,所以我在这里用百话解释一下:
简单来讲 就是 假设在A类中有一个打印 Log 的方法,B类是一个主题,这个类中有个集合存储的类型是A类型。
每次new A的时候,B类就把A类用集合保存下来,一旦有什么信息变化的时候,就会遍历这个集合,然后分别调用每个new 出来的A中的打印Log的方法。可以将信息传递给这个方法,就打印指定的信息。如果有不懂的,欢迎留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值