观察者模式

2018-10-12  本文已影响7人  fomin

1、概述

观察者模式是一种对象行为型模式,定义了一对多的依赖关系,让多个观察者对象同时监听某个主题对象。这个主题对象会通知所有的观察者对象,使他们自动更新自己。
它关键对象是观察目标和观察者,每个观察者都将即时更新自己的状态,以与目标状态同步,这种交互也称为发布-订阅(publishsubscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通知。

2、模式结构

图片

观察者涉及角色:

3、使用场景

4、优缺点

优点:

缺点:

5、实例

首先定义被观察者

public interface Subject {
    public void attach(Observer obj);

    public void detach(Observer obj);

    public void notifyObserver(String topicName);
}

在创建一个关联的观察者

public interface Observer {
    public void update(String topicName);
}

关联已经建立,现在实现具体的主题

public class Topic implements Subject {
    private List<Observer> list;

    public Topic() {
        list = new ArrayList<>();
    }

    @Override
    public void attach(Observer obj) {
        if (obj == null) {
            return;
        }
        if (!list.contains(obj)) {
            list.add(obj);
        }
    }

    @Override
    public void detach(Observer obj) {
        if (list.contains(obj)) {
            list.remove(obj);
        }
    }

    @Override
    public void notifyObserver(String topicName) {
        for (Observer observer : list) {
            observer.update(topicName);
        }
    }
}

具体观察者的实现,他们将一直关注subject对象。

public class TopicSubscriber implements Observer {

    private String name;

    public TopicSubscriber(String name) {
        this.name = name;
    }

    @Override
    public void update(String topicName) {
        System.out.println(name + " topic name update:" + topicName);
    }
}

测试,定义三个具体的观察者,然后注销一个观察者。

public void testTopic() {
    Topic topic = new Topic();
    TopicSubscriber sub1 = new TopicSubscriber("sub1");
    TopicSubscriber sub2 = new TopicSubscriber("sub2");
    TopicSubscriber sub3 = new TopicSubscriber("sub3");
    topic.attach(sub1);
    topic.attach(sub2);
    topic.attach(sub3);
    topic.notifyObserver("new topic1");
    topic.detach(sub3);
    topic.notifyObserver("new topic2");
}
打印日志
sub1 topic name update:new topic1
sub2 topic name update:new topic1
sub3 topic name update:new topic1
sub1 topic name update:new topic2
sub2 topic name update:new topic2
上一篇下一篇

猜你喜欢

热点阅读