安卓浅谈和使用观察者设计模式

来源:互联网 发布:q币回收软件 编辑:程序博客网 时间:2024/05/20 20:46

观察者模式(Observer Pattern)

  • 定义对象间的一种一个(Observable)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。

  • 当然,MVC只是Observer模式的一个实例。

  • Observer模式要解决的问题为:建立一个一(Observable)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。Observer模式就是解决了这一个问题。

  • 因此我们知道,观察者模式中主要有观察者和被观察者2个对象,而在观察模式中Observable表示被观察者,由于这个对象是一个抽象类,所以只能被继承。而Observer表示观察者,它并不是一个类而是一个接口,所以观察者可以有多个,实现了该接口的类都属于观察者。 当然有人会问既然被观察者是一个抽象类而观察者是一个接口,那么是否有一个类即继承Observable类又实现Observer接口呢,这个自然可以,观察者当然也可以同时是被观察者,被观察者同样可以是观察者,在这里完全不冲突。

  • 当某一个我们需要被观察的对象继承自Observable类时,就表示该类可以被很多观察者(实现了Observer)观察,其实意思就是说这个对象也就是被观察者“上电视了”,电视前的你也就是观察者可以看,(对象发生变化)电视里被观察者做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。

观察者模式的适用性:

  1. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面,将这两者封装成独立的对象中以使它们可以各自独立的改变和服用
  2. 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
  3. 当一个对象必须通知其它对象,而它又不能假定其它对象是谁

观察者模式的参与者:

  1. Observable(目标也叫被观察者) 
    • 目标知道它的观察者,可以有任意多个观察者观察同一个目标
    • 提供注册和删除观察者对象的接口
  2. Observer(观察者) 
    • 为那些在目标发生改变时需获得通知的对象定义个更新的接口
  3. ConcreteObservable(具体目标) 
    • 将有关状态存入各ConcreteObserver对象
    • 当它的状态发送改变时,向它的各个观察者发出通知
  4. ConcreteObserver(具体观察者) 
    • 维护一个指向ConcreteObserver对象的引用
    • 存储有关状态,这些状态应与目标的状态保持一致

    • 实现Observer的更新接口是自身状态与目标的状态保持一致


      这里只将常用的2、Observer观察者的具体代码设计如下:
1、定义Observable类
public class ChatMessageManager extends Observable {


   
   @Override
   public void notifyObservers() {
      setChanged();
      super.notifyObservers();
   }


   @Override
   public void notifyObservers(Object data) {
      //
      setChanged();
      super.notifyObservers(data);
   }


}   






2、在收到回执通知的页面需要提醒其他页面做出相应操作时,在此位置创建ChatMessageManager对象(最好使用单例模式创建对象)相应代码如下:
   public ChatMessageManager getChatMsgManager() {
if (chatMsgManager == null) {
chatMsgManager = new ChatMessageManager();
}
return chatMsgManager;
}


    然后拿到ChatMessageManager对象后调用继承自Observable类中的notifyObservers(Object data)方法,将接收到的数据传入此方法中(类型自定)相应代码如下:


    chatMsgManager.notifyObservers(chat);


3、需要做相应处理的Activity做如下处理:
    (1)创建Observer对象重写其中的update(Observable observable, Object data)方法。
    (2)再次通过ChatMessageManager对象添加此Observer对象的观察者
    (3)在重写的update方法观察到data,做相应的操作
     代码如下:
                observer = new Observer() {



@Override
public void update(Observable observable, Object data) {



}
};


  chatMsgManager.addObserver(observer); // 添加观察者observer




4、这样就可以通过观察者这种设计模式进行跨页面进行消息传递了。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 浮云牧场没房了怎么办 融资股票停牌了怎么办 买入的股票停牌怎么办 淘宝抢到便宜货老板不发货怎么办 微信代购买到假货了怎么办 微信代购收到假货怎么办 苹果商店下载很慢怎么办 谷歌商店下载东西慢怎么办 买家说少发货了怎么办 人肉代购被海关扣了怎么办 韩国代购被海关扣了怎么办 爱奇艺开通自动续费忘了账号怎么办 小米手机云储存空间不足怎么办 路由器被黑了打不开网页怎么办 致人轻伤跑了怎么办 轻伤对方要30万怎么办 老公用老婆的钱怎么办 想注册个公司要怎么办 域名续费不知道找谁怎么办 代收快递弄丢了怎么办 货到付款的快递人不在怎么办 快递送货上门人不在怎么办 ems快递签收人不在怎么办 快递被别人取了怎么办 怎么办快递宗和收发点 快递电话写错了怎么办 网上买沙发想退货怎么办 买的电脑想退货怎么办 买了衣服想退货怎么办 天猫买药审核通过后不要了怎么办 京东维修无发票怎么办 京东维修没有发票怎么办 苹果6s外音没了怎么办 苹果6splus开不了机怎么办 顺丰快递寄件填错收件人地址怎么办 收快递电话换了怎么办 顺丰快递没人收怎么办 网购东西没收到怎么办 中通快递没收到怎么办 快递员不给验货怎么办 顺丰验货不要了怎么办