Java设计模式之观察者模式

概论

什么是观察者模式呢?观察者模式也叫发布订阅模式。定义对象间一种一对多的依赖关系,是的每当一个对象改变了状态,则所有依赖于它的对象都会得到通知并且自动更新。

观察者模式示例

首先我们定义一个抽象的观察者:

1 public interface Observer {
2 
3     public void update();
4 }

一般定义为接口,第3行,提供一个接口用于接收被观察者的动态。我们再增加一个具体的观察者:

1 public class ConcreateObserver implements Observer {
2 
3     @Override
4     public void update() {
5         System.out.println("接受到被观察者的通知,并且处理");
6     }
7 }

我们定义一个抽象的被观察者。被观察者的职责是能够动态的增加观察者和删除观察者,并且行为的改变能够通知所有的观察者。增加和删除这两个动作我们叫做管理。于是抽象的被观察者的责任就是管理观察者,同时及时把动态通知观察者。

 1 public abstract class AbstractSubject {
 2 
 3     private List<Observer> observers = new ArrayList<Observer>();
 4 
 5     public abstract void proccess();
 6 
 7     public void add(Observer observer) {
 8         if(observer == null) {
 9             return;
10         }
11 
12         this.observers.add(observer);
13     }
14 
15     public void remove(Observer observer) {
16         this.observers.remove(observer);
17     }
18 
19     public void notifyObservers() {
20 
21         observers.forEach(item -> {
22             item.update();
23         });
24 
25     }
26 
27 
28 }

第3行,定义一个集合用来存储订阅的观察者。

第7行-14行,增加一个观察者。

第15行-17行,删除一个观察者。

第19行-25行,通知所有的观察者。

再来看看具体的被观察者:

1 public class ConcreateSubject extends AbstractSubject {
2 
3     @Override
4     public void proccess () {
5         System.out.println("执行业务逻辑....");
6         super.notifyObservers();
7     }
8 }

第5行,执行具体的业务逻辑。

第6行,被观察者的业务发生了变化,需要通知所有的观察者。调用父类的方法。

最后我们增加一个场景类Client:

 1 public class Client {
 2 
 3     public static void main(String[] args) {
 4         AbstractSubject subject = new ConcreateSubject();
 5         Observer observer = new ConcreateObserver();
 6 
 7         subject.add(observer);
 8         subject.add(observer);
 9 
10         subject.proccess();
11     }
12 }

我们先执行一下结果:

执行业务逻辑....
接受到被观察者的通知,并且处理
接受到被观察者的通知,并且处理

观察者模式的优缺点

1.观察者和被观察者之间是抽象耦合。

2.建立一套触发机制。

观察者较多时,容易造成阻塞,因此可以采用异步的方式通知。

原文地址:https://www.cnblogs.com/candies123/p/10084546.html