观察者模式

Android进阶之设计模式

观察者模式

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

使用场景:

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

优点: 观察者和被观察者之间是抽象耦合,应对业务变化. 增强系统灵活性,可扩展性.

缺点: 在使用时应该考虑一下开发效率和运行效率.程序中包含一个被观察者,多个观察者,开发和调试等内容会比较复杂,而且在 Java 中消息的通知默认是顺序执行的,一个观察者卡顿,会影响整体的执行效率,这种情况下,一般采用异步的方式.

举个例子:


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

    public Coder(String name) {
        this.name = name;
    }

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

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


/**
 * DevTechFrontier 开发技术前线,这个网站就被观察者角色,当它更新时所有的
 * 观察者都会收到相应的通知.
 * */
public class DevTechFrontier extends Observable{

    public void postNewFeed(String content){
        //标识状态或者内容发生变化.
        setChanged();
        //通知所有观察者
        notifyObservers(content);
    }
}

 public static void main(String[] args) {
 
 
        //被观察者角色
        DevTechFrontier devTechFrontier = new DevTechFrontier();

        //观察者

        Coder mrsimple = new Coder("mr.simple");
        Coder coder1 = new Coder("code-1");
        Coder coder2 = new Coder("code-2");
        Coder coder3 = new Coder("code-3");

        devTechFrontier.addObserver(mrsimple);
        devTechFrontier.addObserver(coder1);
        devTechFrontier.addObserver(coder2);
        devTechFrontier.addObserver(coder3);

        devTechFrontier.postNewFeed("新一期的内容更新啦");
}

打印出来结果:

Hi, code-3, DEvTechFrontier 更新啦,内容是 新一期的内容更新啦
Hi, code-2, DEvTechFrontier 更新啦,内容是 新一期的内容更新啦
Hi, code-1, DEvTechFrontier 更新啦,内容是 新一期的内容更新啦
Hi, mr.simple, DEvTechFrontier 更新啦,内容是 新一期的内容更新啦

能看出来通知顺序是,后添加进去的先通知到.

推荐阅读更多精彩内容