3 行为型模式之

观察者模式介绍: 

观察者模式是一个使用率非常高的模式,这最深用的地方是GUI系统,订阅--发布系统。因为这个模式一个重要作用就是解耦,将被观察者和观察者解耦,使得他们之间的依赖性更小。

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

使用场景:

1 关联行为场景。需要注意的是,关联行为是可拆分的,而不是“组合”的关系

2 事件多级触发场景

3 跨系统的消息交换场景,如消息队列,事件总线的处理机制

下面我们以生活中的交通灯:以行人过马路说起为例,其中车和行人是观察者,红灯是被观察者,以人的视角为例

观察者:车和行人

被观察者:红灯

红灯亮了(车对面的绿灯也亮了),车行,行人停

代码如下:

1 /**
2  * 观察者
3  */
4 public abstract class Observer {
5     protected abstract void onChange();
6 }
1 /**
2  * 观察者:车
3  */
4 public class Car extends Observer{
5     @Override
6     protected void onChange() {
7         System.out.println("绿灯亮了,我可以走了");
8     }
9 }
1 /**
2  * 观察者:行人
3  */
4 public class People extends Observer{
5     @Override
6     protected void onChange() {
7         System.out.println("红灯亮了,我要等一等");
8     }
9 }

下面是被观察者:灯

 1 /**
 2  * 被观察者:灯
 3  */
 4 public class Observable {
 5     //观察者集合
 6     private ArrayList<Observer> observers = new ArrayList<>();
 7 
 8     //注册一个观察者
 9     public void registerObserver(Observer observer){
10         observers.add(observer);
11     }
12 
13     //反注册一个观察者
14     public void unregisterObserver(Observer observer){
15         observers.remove(observer);
16     }
17 
18     public void dataChanged(){
19         for (Observer observer : observers){
20             observer.onChange();
21         }
22     }
23 
24 }

下面是测试类

 1 /**
 2  * 测试观察者模式
 3  */
 4 public class ObserverTest {
 5 
 6     public static void main(String[] args){
 7 
 8         //创建两个观察者
 9         Observer car = new Car();
10         Observer people = new People();
11 
12         //创建一个被观察者
13         Observable observable = new Observable();
14 
15         //注册两个观察者
16         observable.registerObserver(car);
17         observable.registerObserver(people);
18 
19         //被观察者发出某一个事件
20         observable.dataChanged();
21 
22     }
23 
24 
25 }

被观察者保存一个观察者的列表,被观察者状态一变,就遍历观察者列表并调用观察都onChange函数,但是也有一个弊端,如果观察者过多的话,导致被观察者中的列表太大,会有性能上的问题。所以要视情况而定再使用,当然也可以结合线程池等来优化。

注:设计模式交流学习群 632945466  欢迎所有热爱技术的大牛,小菜,一起学习讨论进步提高,欢迎随时批评指正

原文地址:https://www.cnblogs.com/start1225/p/6725295.html