3 行为型模式之 - 观察者模式
九路 177 6

观察者模式介绍:

观察者模式是一个使用率非常高的模式,这最深用的地方是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函数,但是也有一个弊端,如果观察者过多的话,导致被观察者中的列表太大,会有性能上的问题。所以要视情况而定再使用,当然也可以结合线程池等来优化。

预览图
评论区

索引目录