观察者模式——行为型

87 阅读2分钟

1.白话文定义

对象间的一种一对多的依赖关系。当一个对象的状态发生变化,所有依赖它的对象都将得到通知, 使这些观察者执行相应的逻辑。

2.角色

1.事件监听接口类:定义接口;

2.事件监听实现类:实现具体的方法;

3.事件管理者类:提供给事件订阅,取消订阅,事件通知等方法;

4.客户端调用者:被观察者调用事件管理类,进行事件的订阅,取消订阅和通知等操作。

3.类图

image.png

4.代码实现

1.事件监听接口类

public interface EventListener {

    void onEvent(String param);
}

2.事件监听实现类

public class MsgEventListener implements EventListener {

    @Override
    public void onEvent(String param) {
        System.out.println("短信消息事件");
    }
}
public class PushEventListener implements EventListener {
    @Override
    public void onEvent(String param) {
        System.out.println("push消息事件");
    }
}

3.事件管理者类

public class EventManager {
    
    Map<Enum<EventType>, List<EventListener>> listeners = new HashMap<>();
    
    /**
     * @param operators
     * @return
     * @desc 事件管理器
     */
    public EventManager(Enum<EventType>... operators) {
        for (Enum<EventType> typeEnum : operators) {
            listeners.put(typeEnum, new ArrayList<>());
        }
    }
    
    /**
     * @param eventType     事件类型
     * @param eventListener 事件监听器
     * @desc 订阅事件
     */
    public void subscribe(EventType eventType, EventListener eventListener) {
        List<EventListener> list = listeners.get(eventType);
        list.add(eventListener);
    }
    
    /**
     * @param eventType     事件类型
     * @param eventListener 事件监听器
     * @desc 取消订阅
     */
    public void unsubscribe(EventType eventType, EventListener eventListener) {
        List<EventListener> list = listeners.get(eventType);
        list.remove(eventListener);
    }
    
    /**
     * @param eventType 事件类型
     * @param param     参数
     * @desc 事件通知
     */
    public void notify(EventType eventType, String param) {
        List<EventListener> list = listeners.get(eventType);
        for (EventListener eventListener : list) {
            eventListener.onEvent(param);
        }
    }
    /**
     * @author kerry
     * @desc 事件类型枚举类
     * @date 2022/12/11
     */
    public enum EventType {
        MSG, PUSH
    }
}

4.客户端调用者

public class Main {


    public static void main(String[] args) {
        
        EventManager eventManager = new EventManager(EventManager.EventType.MSG, EventManager.EventType.PUSH);

        //订阅短信事件
        eventManager.subscribe(EventManager.EventType.MSG, new MsgEventListener());
        //订阅push消息事件
        eventManager.subscribe(EventManager.EventType.PUSH, new PushEventListener());

        //事件通知
        eventManager.notify(EventManager.EventType.MSG, "kerry");
    }
}

5.优点

1.观察者和被观察者是抽象耦合关系;

2.建立一套触发机制。

6.缺点

如果被观察者对象有很多观察者,则事件通知会花费更多时间。

7.使用场景

需要对一个事件状态进行监听,然后执行更多剩余逻辑。

8.参考

观察者模式