观察者设计模式

起因假设有一个场景:你需要在不同界面更新数据,然后在得到数据后在另一个界面进行操作,你会怎么做?

UML图

Android中EventBus为什么这么火!

经思考你会发现,Android中Activity,Fragment,service等交互有时候是很麻烦的,你可能会说使用广播,但是使用广播其实也是很麻烦的

你需要在A中注册/接收广播,在B中发送广播,要传递的信息---实体类还要需要实现序列化接口其实从代码层次来看是很麻烦的

综上,EventBus,广播接收的设计都是观察者设计模式

简单实现

1.观察者接口及实现类

//一个Observer接口:
1.public interface Observer {  
2.    public void update();  
3.}  

//两个实现类:
1.public class Observer1 implements Observer {  
2.  
3.    @Override  
4.    public void update() {  
5.        System.out.println("observer1 has received!");  
6.    }  
7.}  
1.public class Observer2 implements Observer {  
2.  
3.    @Override  
4.    public void update() {  
5.        System.out.println("observer2 has received!");  
6.    }  
7.  
8.}  

2.订阅者接口及实现类

//订阅者接口
public interface Subject {  
2.      
3.    /*增加观察者*/  
4.    public void add(Observer observer);  
5.      
6.    /*删除观察者*/  
7.    public void del(Observer observer);  
8.      
9.    /*通知所有的观察者*/  
10.    public void notifyObservers();  
11.      
12.    /*自身的操作*/  
13.    public void operation();  
14.}  
//实现接口的抽象类
1.public abstract class AbstractSubject implements Subject {  
2.  
3.    private Vector<Observer> vector = new Vector<Observer>();  
4.    @Override  
5.    public void add(Observer observer) {  
6.        vector.add(observer);  
7.    }  
8.  
9.    @Override  
10.    public void del(Observer observer) {  
11.        vector.remove(observer);  
12.    }  
13.  
14.    @Override  
15.    public void notifyObservers() {  
16.        Enumeration<Observer> enumo = vector.elements();//放入观察者的集合,并循环遍历来调用(通知)观察者的update()方法
17.        while(enumo.hasMoreElements()){  
18.            enumo.nextElement().update();  
19.        }  
20.    }  
21.}  
//继承抽象类的具体实现类
1.public class MySubject extends AbstractSubject {  
2.  
3.    @Override  
4.    public void operation() {  
5.        System.out.println("update self!");  
6.        notifyObservers();  
7.    }  
8.  
9.}  

3.测试使用

//将所有 的观察者放入集合并调用订阅函数
public class ObserverTest {  
2.  
3.    public static void main(String[] args) {  
4.        Subject sub = new MySubject();  
5.        sub.add(new Observer1());  
6.        sub.add(new Observer2());  
7.          
8.        sub.operation();  
9.    }  
10.  
11.} 

输出结果

update self!
observer1 has received!
observer2 has received!

原文地址:https://www.cnblogs.com/fanfusuzi/p/6847119.html