暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基础一练:观察者模式

CodingWithFun 2019-09-27
158

观察者模式是开发中常使用的模式,值得亲自敲一遍。话不多说,撸代码!

观察者模式的定义

我们先看一下观察者模式的定义:

定义对象间的一种一对多的依赖关系。当一个对象的状态发生变化,所有依赖它的对象都得到通知并被自定更新。

状态发生变化的对象就是被观察者Observerable,得到通知的对象是观察者Observer。举个例子,一个报社有很多订阅者,当有新报纸时,报社要将新报纸投递给每个订阅者。那么报社就是被观察者,订阅人就是观察者。作为报社要提供订阅的途径、退订的途径,订阅者要提供报纸投递地址。

我们可以抽象出来一下几个类:一个Observerable接口代表被观察者、一个Observer代表观察者以及它们的实现类。具体类图如下:



Observerable定义被观察要实现的接口,包括注册、删除、通知接口。代码如下:

1public interface Observerable {
2
3    void registerObserver(Observer observer);
4
5    void removeObserver(Observer observer);
6
7    void notifyObserver();
8
9}


具体的实现类,要实现三个接口,同时定义必要的字段存储观察者列表以及自身的状态。

 1public class ConcreteObserverable implements Observerable{
2
3    List<Observer> observers = new ArrayList<Observer>();
4
5    private String message;
6
7    public void registerObserver(Observer observer) {
8        observers.add(observer);
9    }
10
11    public void removeObserver(Observer observer) {
12        observers.remove(observer);
13    }
14
15    public void notifyObserver() {
16        observers.forEach(observer -> {
17            observer.update(message);
18        });
19    }
20}


Observer接口代表观察者,其定义更新方法,作为观察者得到新消息自身要进行处理。

1public interface Observer {
2
3    void update(String message);
4
5}


具体的实现类:

1public class ConcreteObserver implements Observer {
2    @Override
3    public void update(String message) {
4        System.out.println("receive new message: "  + message);
5    }
6}


观察者模式的意义

观察者模式本质上是联动触发机制。当修改目标对象时,触发相应的通知,然后通知所有观察者,实现了广播通信模式。同时目标对象可以与观察者松解耦。

文章转载自CodingWithFun,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论