学习笔记

Android源码设计模式_8观察者模式
Publish: 2018/8/26   

定义

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

使用场景

  1. 关联行为场景,需要注意的是,关联行为是可拆分的,而不是”组合”关系。
  2. 时间多级触发场景。
  3. 跨系统的消息交换场景,如消息队列,事件总线的处理机制。

实现示例


 /**
  * 程序员是观察者
  * /
 public class Coder implements Observer{
    public String name;

    public cODER(String aName){
       name = aName;
    }

    @Override
    public void update(Observvable o,Object arg){
        System.out.println("Hi,"+name+",DevTechFrontier更新啦,内容:"+arg);
    }

    @Override
    public String toString(){
        return "码农:"+name;
    }
 }

 /**
  * DevTechFrontier 即开发技术前线,这个网站是被观察者角色,
  * 当它有更新时所有的观察者(这里是程序员)都会接到相应的通知
  * /
 public class DeTechFrontier extends Observable{
     public void postNewPublication(String content){
         //标识状态或者内容发生改变
         setChanged();
         //通知所有观察者
         notifyObservers(content);
     }
 }

 //测试代码
 public class Test{
     public static void main(String[] args){
         //被观察的角色
         DevTechFrontier DevTechFrontier = new DevTechFrontier();
         //观察者
         Coder mrsimple = new Coder("mr.simple");
         Coder coder1 = new Coder("coder-1");
         Coder coder2 = new Coder("coder-2");
         Coder coder3 = new Coder("coder-3");

         //将观察者注册到可观察对象的观察者列表中
         DevTechFrontier.addObserver(mrsimple);
         DevTechFrontier.addObserver(coder1);
         DevTechFrontier.addObserver(coder2);
         DevTechFrontier.addObserver(coder3);

         //发布消息
         DevTechFrontier.postNewPublication("新的一期开发技术前线周报发布啦!");
     }
 }

缺点

在java中消息的通知默认是顺序执行,一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般考虑采用异步的方式。

优点



← 深入理解JVM_类加载1 Android源码设计模式_7命令模式 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel