观察者模式

Posted a-fm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。

观察者模式

标签(空格分隔): 设计模式


观察者模式: 当对象之间存在一对多的关系的时候, 则使用观察者模式. 比如当一个对象呗修改的时候, 则会自动通知他的依赖对象, 观察者模式属于行为模式

优点

观察者模式实现了动态联动
观察者模式实现了广播通信

缺点

如一个主题被大量观察者观察, 则通知所有的观察者的代价较高.
如果某些观察者的相应方法被阻塞, 整个通知过程也会被阻塞, 其他观察者不能及时被通知.

public interface Observer {
    void update(String info);
}
public class StudentObserver implements Observer {
    private String name;

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

    @Override
    public void update(String info) {
        System.out.println(name+"收到消息"+info);
    }
}
import java.util.ArrayList;
import java.util.List;

public interface Subject{
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String msg);
}
import java.util.ArrayList;
import java.util.List;

public class TeacherSubject implements Subject{
    //用来存放和记录观察者
    private List<Observer> observers=new ArrayList<Observer>();
    @Override
    public void registerObserver(Observer obj) {  //增加观察者
        observers.add(obj);
    }
    @Override
    public void removeObserver(Observer obj) {  //删除观察者
        int i = observers.indexOf(obj);
        if( i >= 0 )
            observers.remove(obj);
    }
    @Override
    public void notifyObservers(String msg) {   //通知消息
        for(Observer observer : observers) {
            observer.update(msg);
        }
    }
}
public class Test {
    public static void main(String[] args){
        TeacherSubject teacher = new TeacherSubject();
        StudentObserver studentObserver1 = new StudentObserver("鸣人");
        StudentObserver studentObserver2 = new StudentObserver("佐助");
        teacher.registerObserver(studentObserver1);
        teacher.registerObserver(studentObserver2);
        teacher.notifyObservers("发作业啦");
    }
}

以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者

永远观察实时数据的片段

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式