观察者模式

简介: 定义定义对象的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式是行为型模式之一。包含观察者模式包括观察者与被观察者两个基本元素,观察者会注册到被观察者中,而被观察者会保持和观察者的对应关系。

定义

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

观察者模式是行为型模式之一。包含观察者模式包括观察者与被观察者两个基本元素,观察者会注册到被观察者中,而被观察者会保持和观察者的对应关系。

如果被观察的对象产生一些观察者感兴趣的变更,则观察者会得到通知从而去执行相关的操作。

常见的观察者模式

提到观察者模式,首先会想到前端中常用的事件机制。例如为dom元素绑定事件:

$(document).click(function (e) {
    console.dir(e);
});

这里的匿名function就是观察者,而document则是被观察者,.click(function)则是观察者注册的过程,此后document发生click事件时,被观察者则会收到通知,从而执行自己的逻辑console.dir(e)。

使用观察者模式

现在我们使用Java来模拟观察者模式。

先创建事件,包含事件源,通知目标,回调方法以及触发者等属性。

/**
 * 事件
 */
public class Event {

    private Object source; // 事件源
    private Object target; // 通知目标
    private Method callback; // 回调方法名称
    private String trigger; // 触发者
    private long time;

    public Event(Object target, Method callback) {
        this.target = target;
        this.callback = callback;
    }

    // 省略getter、setter
}

定义事件类型,此处定义添加、删除两种类型。

/**
 * 事件类型
 */
public enum EventType {
    /**
     * 添加
     */
    ADD,

    /**
     * 删除
     */
    RMOVE
}

定义抽象被观察者(主题),包含主题名称,保持与观察者引用映射的容器,以及事件触发的方法。

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 抽象主题
 * 定义主题通用的容器、事件注册及事件触发
 */
public class AbstractSubject {

    protected String name;
    protected Map<Enum,Event> eventMap = new HashMap<>(); // 注册容器

    public AbstractSubject() {}

    protected AbstractSubject(String name) {
        this.name = name;
    }

    /**
     * 事件注册
     * @param eventType
     * @param target
     * @param callback
     */
    public void addLisenter(Enum eventType, Object target, Method callback) {
        eventMap.put(eventType, new Event(target, callback));
    }

    /**
     * 事件触发
     * @param eventType
     */
    protected void trigger(Enum eventType) {
        Event event = this.eventMap.get(eventType);
        if(null == event) {
            return;
        }

        event.setSource(this);
        event.setTrigger(eventType.toString());
        event.setTime(System.currentTimeMillis());

        try {
            event.getCallback().invoke(event.getTarget(), event);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

    // 省略getter、setter
}

定义具体主题:

/**
 * 主题,被观察者
 */
public class Subject extends AbstractSubject {

    public Subject(String name) {
        super.name = name;
    }

    public void add() {
        trigger(EventType.ADD);
    }

    public void remove() {
        trigger(EventType.RMOVE);
    }
}

定义观察者,包含添加、删除事件对应的回调方法。

/**
 * 观察者
 */
public class Observer {

    public void onAdd(Event event) {
        System.out.println("收到" + event.getTrigger() + "的添加事件");
    }

    public void onRemove(Event event) {
        System.out.println("收到" + event.getTrigger() + "的删除事件");
    }
}

测试类:

/**
 * 测试类
 */
public class Test {

    public static void main(String[] args) throws NoSuchMethodException {
        // 观察者
        Observer observer = new Observer();

        // 观察者收到通知后执行的方法
        Method onAdd = Observer.class.getMethod("onAdd", Event.class);
        Method onRemove = Observer.class.getMethod("onRemove", Event.class);

        // 被观察者
        Subject subject = new Subject("目标1号");

        // 事件绑定
        subject.addLisenter(EventType.ADD, observer, onAdd);
        subject.addLisenter(EventType.RMOVE, observer, onRemove);

        // 被观察者触发事件
        subject.add();
        subject.remove();
    }
}

其中,得到观察者和主题对象后,进行观察者的注册,然后主题执行动作触发事件,这是整个流程。

如果需要做成主题和观察者一对多的映射,则将Event的target改成集合类型,如下:

private List<Object> targets; // 通知目标
目录
相关文章
|
1天前
观察者模式
​ 如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见,同时文中给出大部分示例 如果觉得本文写的不错,不妨点个赞,收藏一下,助力博主产生质量更高的作品 概念 观察者模式是一种对象行为型模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 在观察者模式中,存在两种类型的对象:目标对象和观察者对象。目标对象负责发出通知,而观察者对象则订阅目标对象,以便在目标对象的状态发生变化时接收到通知。一旦接收到通知,观察者对象就会执行相应的行为。 优缺点 观察者模式的优点主要包括: 解耦:观察者模式有助于降低目标对象和观察者对象
2 0
|
1月前
|
C++
【C++】—— 观察者模式
【C++】—— 观察者模式
|
1月前
|
设计模式 JavaScript 开发者
详细讲解什么是观察者模式
详细讲解什么是观察者模式
|
9月前
|
关系型数据库 API
观察者模式解读
观察者模式解读
|
4月前
行为型 观察者模式(发布订阅)
行为型 观察者模式(发布订阅)
17 0
|
4月前
|
设计模式 Java
【观察者模式】 ——每天一点小知识
【观察者模式】 ——每天一点小知识
|
6月前
5 # 观察者模式
5 # 观察者模式
15 0
|
11月前
|
XML 设计模式 Java
观察者模式(下)
观察者模式(下)
41 0
|
11月前
|
设计模式
观察者模式(上)
观察者模式(上)
53 0
|
设计模式
我学会了,观察者模式
观察者模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
104 0
我学会了,观察者模式