观察者模式

2020-02-06 23:02
729
0
观察者模式(Observer Pattern)在对象之间定义了一对多的依赖,当一个对象改变状态,它会通知依赖的对象。
属于行为模式。JAVA里已经实现了观察者模式。
 
应用实例
Zookeeper事件通知节点、消息订阅通知、安卓开发事件注册分布式配置中心
 
实现方式
看类图可明白,核心就如下2点:
1、主题中定义3个方法:添加、删除和通知观察者。
2、观察者定义一个回调方法,供主题在通知的时候回调。
主题对观察者一般都是一对多的关系,所以主题中可以用队列保存观察者对象,通知的时候循环异步调用,订阅一个主题就是在主题的观察者列表中添加一个观察者。
 
示例代码
其他代码基本看下类图就已经了解了,并且由于Java中已经实现了观察模式,在此仅手写一下主题的实现类。
public class HelloSubject implements MySubject {

    private List<ObServer> obServerList = new ArrayList<ObServer>();
    @Override
    public void attach(ObServer obServer) {
        obServerList.add(obServer);
    }

    @Override
    public void detach(ObServer obServer) {
        obServerList.remove(obServer);
    }

    @Override
    public void notify(String message) {
        for (int i = 0; i < obServerList.size(); i++) {
            ObServer obServer = obServerList.get(i);
            // 调用该方法通知 获取具体的消息
            obServer.update(message);
        }
    }
}

如上只是一个示例,没有做多线程处理,notify传入的参数实际中可以改成json对象、Map等。

 

JDK中观察者模式实现:

jdk中以Observable作为主题类,Observer作为观察者的接口。

如下所示,Observable已经实现了对观察者的各项操作方法。

有一点需注意,如下图所示,在通知观察者的方法中,changed变量如果为false则会返回,所以在调用通知方法前,先需要调用setChanged()方法。

如下所示,可以继承Observable类,重写notifyObservers方法。

public class MessageObServable extends Observable {
    
    @Override
    public void notifyObservers(Object arg) {
        // 1.修改状态为可以群发
        setChanged();
        // 2.调用父类的notifyObservers 群发消息
        super.notifyObservers(arg);
    }
}

观察者类实现Observer接口,在update方法中实现业务逻辑即可,arg为notifyObservers传递过来的参数。

public class MessageObServer implements Observer {
    public void update(Observable o, Object arg) {
        System.out.println("用户下单成功,发送邮件提醒内容:" + arg);
    }
}

注册和发送通知的代码如下:

public class TestJdkObServer {
    public static void main(String[] args) {
        // 1.创建具体的主题
        Observable observable = new MessageObServable();
        // 2. 注册观察者
        observable.addObserver(new MessageObServer());
        // 3.群发消息
        observable.notifyObservers("Hello,你好啊!");
    }
}

 

Spring中观察者模式的实现:
spring中的事件、监听就是把观察者模式封装而成。
spring会自动注册监听。
 
参考文献:
spring事件监听:https://www.cnblogs.com/xinde123/p/8918714.html
观察者模式:https://www.runoob.com/design-pattern/observer-pattern.html
蚂蚁课堂设计模式视频:http://www.mayikt.com/front/couinfo/194/0

全部评论