前言

观察者模式是一种最最为常见的设计模式,代码中基本会要用到这个。记录一下相关知识,方便自己回顾和查阅。

正文

观察者模式

观察者模式(Observer Pattern): 定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

观察者模式是一种对象行为型模式

设计模式之观察者模式

主要角色

  1. 目标(Subject)

    被观察者,它是指被观察的对象。提供添加、删除和通知观察者的方法

  2. 具体目标(ConcreteSubject)

    继承目标(Subject),实现具体业务逻辑。

  3. 观察者(Observer)

    抽象观察者,观察主题目标的状态变化,实现 update()来更新自己的状态。

  4. 具体观察者(ConcreteObserver)

    继承自抽象观察者,实现具体业务逻辑。

设计模式之观察者模式

demo

目标

被观察者,它是指被观察的对象。提供添加、删除和通知观察者的方法

public  interface Subject {
    void addObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObserver();
}
具体目标

继承目标(Subject),实现具体业务逻辑。

public class ConcreteSubject implements Subject {
    //只是简单测试,不涉及多线程
    private final List<Observer> list = new ArrayList<>();


    @Override
    public void addObserver(Observer observer) {
        if (null != observer) {
            list.add(observer);
        }
    }

    @Override
    public void removeObserver(Observer observer) {
        if (null != observer) {
            list.remove(observer);
        }
    }

    @Override
    public void notifyObserver() {
        for( Observer observer: list){
            observer.update();
        }
    }
}

观察者

抽象观察者,观察主题目标的状态变化,实现 update()来更新自己的状态。

public interface Observer {
     void update();
}
具体观察者

继承自抽象观察者,实现具体业务逻辑。

public class ConcreteObserver1 implements Observer{
    @Override
    public void update() {
        //收到更新通知,do something
    }
}
public class ConcreteObserver2 implements Observer{
    @Override
    public void update() {
        //收到更新通知,do something
    }
}
客户端
ConcreteObserver1 concreteObserver1 = new ConcreteObserver1();
ConcreteObserver2 concreteObserver2 = new ConcreteObserver2();
ConcreteSubject concreteSubject = new ConcreteSubject();

concreteSubject.addObserver(concreteObserver1);
concreteSubject.addObserver(concreteObserver2);
//有更新,通知观察着
concreteSubject.notifyObserver();

优缺点

优点
  1. 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系

  2. 目标与观察者之间建立了一套触发机制

  3. 符合“开闭原则”的要求

缺点
  1. 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用

  2. 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率

课外知识

观察者模式在Android也是很常见的

  1. ListView和Adapter监听数据变化

  2. 广播机制

  3. EventBus

  4. RxAndroid

参考文章

  1. 观察者模式,这一篇就搞定

  2. 设计模式-观察者模式(Observer)

  3. 观察者模式

相关文章

暂无评论

none
暂无评论...