观察者模式介绍:
观察者模式是一个使用率非常高的模式,这最深用的地方是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 欢迎所有热爱技术的大牛,小菜,一起学习讨论进步提高,欢迎随时批评指正