观察者模式介绍:
观察者模式是一个使用率非常高的模式,这最深用的地方是GUI系统,订阅--发布系统。因为这个模式一个重要作用就是解耦,将被观察者和观察者解耦,使得他们之间的依赖性更小。
定义
定义对象间一种一对多的关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并被自动更新
使用场景
1 关联行为场景。需要注意的是,关联行为是可拆分的,而不是“组合”的关系 2 事件多级触发场景 3 跨系统的消息交换场景,如消息队列,事件总线的处理机制
下面我们以生活中的交通灯:以行人过马路说起为例,其中车和行人是观察者,红灯是被观察者,以人的视角为例
观察者:车和行人
被观察者:红灯
红灯亮了(车对面的绿灯也亮了),车行,行人停
代码如下:
/**
* 观察者
*/
public abstract class Observer {
protected abstract void onChange();
}
/**
* 观察者:车
*/
public class Car extends Observer{
@Override
protected void onChange() {
System.out.println("绿灯亮了,我可以走了");
}
}
/**
* 观察者:行人
*/
public class People extends Observer{
@Override
protected void onChange() {
System.out.println("红灯亮了,我要等一等");
}
}
下面是被观察者:灯
/**
* 被观察者:灯
*/
public class Observable {
//观察者集合
private ArrayList<Observer> observers = new ArrayList<>();
//注册一个观察者
public void registerObserver(Observer observer){
observers.add(observer);
}
//反注册一个观察者
public void unregisterObserver(Observer observer){
observers.remove(observer);
}
public void dataChanged(){
for (Observer observer : observers){
observer.onChange();
}
}
}
下面是测试类
/**
* 测试观察者模式
*/
public class ObserverTest {
public static void main(String[] args){
//创建两个观察者
Observer car = new Car();
Observer people = new People();
//创建一个被观察者
Observable observable = new Observable();
//注册两个观察者
observable.registerObserver(car);
observable.registerObserver(people);
//被观察者发出某一个事件
observable.dataChanged();
}
}
被观察者保存一个观察者的列表,被观察者状态一变,就遍历观察者列表并调用观察都onChange函数,但是也有一个弊端,如果观察者过多的话,导致被观察者中的列表太大,会有性能上的问题。所以要视情况而定再使用,当然也可以结合线程池等来优化。