A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Android 中常用的通知机制有哪些?
1.   接口回调                     一对一
2.   handler机制                一对一
3.   广播                           一对多
4.   观察者设计模式           一对多
5.   第三方 --> EventBus         一对多
今天给大家讲讲观察者设计模式的使用:
什么是观察者设计模式?
   当一个对象发生变化时,其它依赖该对象的对象都会收到通知,并且随着变化。
对象之间是一种一对多的关系。
   顾名思义,它需要两个角色. 一个是观察者,一个是被观察者. 其中观察者订阅消息,被观察者发送消息.观察者接受消息.
Java 中观察者设计模式:
class Observable   --> 被观察者  -->  发布消息
常用API:
addObserver(Observer)         添加观察者到观察者集合中
deleteObserver(Observer)    从观察者集合中移除观察者
setChanged()                                标记消息已经发生改变
notifyObservers()               通知所有的观察者消息已经发生改变
interfaceObserver  -->  观察者   -->订阅消息
update               接收被观察者发出的消息
代码演示:
游客,如果您要查看本帖隐藏内容请回复
观察者设计模式的原理:
就是使用一个集合,保存所有的观察者(接口对象),当有新的消息需要发布时,遍历集合,通知每个观察者对象
官方观察者设计模式的弊端:
必须继承Observable和Observer类。这样的话,当我们的Activity或者Fragment想使用Java API来实现观察者模式时,就无法实现了。
自定义观察者设计模式:定义SalaryManger 类
备注: 为了确保Salary 类只有一个实例,.我们采用单例设计模式中的双重检查加锁模式保证它只有一个实例.
游客,如果您要查看本帖隐藏内容请回复
定义: 两个观察者类 StaffOneStaffTwo 实现观察者接口,重写方法StaffOne 类
public class StaffOne implements SalaryObserver{
    @Override
    public void GetSalaryInfoChanged(int monkey) {
        // TODO Auto-generated method stub
        System.out.println(StaffOne.class.getSimpleName()+"的薪水是"+monkey);
    }
}
StaffTwo 类
public class StaffTwo implements SalaryObserver{
    @Override
    public void GetSalaryInfoChanged(int monkey) {
        // TODO Auto-generated method stub
        System.out.println(StaffTwo.class.getSimpleName()+"的薪水是"+monkey);
    }
   
}
定义测试类Test
public class Test {
    public static void main(String[] args) {
        SalaryManger msalary=new SalaryManger();
        msalary.addObserver(new StaffOne());
        msalary.addObserver(new StaffTwo());
        msalary.notifyObservers(10000);
    }
}
打印结果:
总结:
我们来梳理一下自定义观察者设计模式的流程:
自定义一个观察者管理类, 在类中定义观察者接口, 以及声明几个必要的方法: 添加观察者,移除观察者, 通知所有观察者消息发生改变.
其中要注意的是,定义一个集合管理所有的观察者. 遵循的原理: 遍历集合,通知所有的观察者  一对多的关系. 为了保证单一实例子, 我们使用双重检查加锁的机制,保证观察者管理类在使用的时候只有一个实例.
其实,细心的人应该发现, 上述写法, 就类似于接口回调. 观察者实现了观察者接口的方法, 因此在消息发生改变后, 被通知, 再对应的实现方法中可以获取数据, 进行相应的操作.




1.png (9.1 KB, 下载次数: 10)

1.png

2 个回复

正序浏览
多谢分享
回复 使用道具 举报
111111111111111111111111
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马