Spring设计模式(观察者模式)

本文深入解析了观察者模式的设计理念,通过实例展示了如何在Java中实现观察者模式,包括定义通知回调格式、观察者接口、监听接口等关键步骤,以及观察者与监听者的关联和测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring设计模式(观察者模式)

博客用于学习记录:方便以后回顾

在记录学习的同时也在学习写博客,之前没有一个整体的目录框架,之后写设计模式的时候就按照现在的目录框架来写。

观察者模式: 在观察者和被观察者之间维护一个队列通道,对队列通道进行维护

学习来源:咕泡学院
JAVA设计模式之观察者模式

源码: https://github.com/RunningPig0820/pattern

模式的定义:

观察者模式的定义:

​ 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。

模式的结构图 :

观察者模式结构图

模式包含角色 :

观察者模式由四个角色组成:

抽象主题角色(Subject):把所有的观察者角色的引用保存在一个集合中,可以有任意数量的观察者。其提供一个接口,可以添加、删除观察者,并可以向登记过的观察者发送通知。

具体主题角色(Observer):实现了抽象主题角色提供的接口的一个具体类。

抽象观察者角色(ConcreteSubject):提供一个接口,以接收主题角色发送的通知。

具体观察者角色(ConcreteObserver):实现了抽象观察者角色提供的接口的一个具体类。

使用场景 :

监听器、日志收集、短信通知、邮件通知

模式具体实现 :

一 : 定义通知回调格式

@Data
@Builder
public class Event {
    /**
     * 事件源
     */
    private Object source;
    /**
     * 通知目标
     */
    private Object target;
    /**
     * 监听事件
     */
    private String message;
    /**
     * 事件时间
     */
    private long time;

}

二 :定义观察者接口

public interface Observer {
    /**
     * 被观察的操作方法
     * @param event 操作打印日志
     */
    public void operation(Event event);
}

三 :定义监听接口

public interface Listener {

    /**
     * 注册观察者
     * @param object
     */
    public void registerObserver(Observer object);

    /**
     * 删除观察者
     * @param observer
     */
    public void removeObserver(Observer observer);

    /**
     * 通知观察者
     * @param message 通知消息
     */
    public void notifyObserver(String message);
}

四:实现观察者接口

public class Person implements Observer {

    private String name;

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

    public void operation(Event event) {
        System.out.println(" 观察者 : " + name + " 接收到信息 " + event.toString());
    }
}

五:实现监听者接口

public class EventListener implements Listener {

    private List<Observer> events = new ArrayList<Observer>();


    public void registerObserver(Observer object) {
        events.add(object);
    }

    public void removeObserver(Observer observer) {
        events.remove(observer);
    }

    public void notifyObserver(String message) {
        for (Observer observer : events) {
            Event event = Event.builder()
                    .source(this)
                    .target(observer)
                    .message(message)
                    .time(System.currentTimeMillis())
                    .build();
            observer.operation(event);
        }
    }
}

六:实现观察者与监听者关联


public class Subject  {

    Listener listener;

    public Subject(Listener listener) {
        this.listener = listener;
    }

    public void sendMsg(String msg){
        System.out.println(msg);
        listener.notifyObserver(msg);
    }

    public void sendBlog(String blog){
        System.out.println(blog);
        listener.notifyObserver(blog);
    }
}

七:测试

public class ObserverTest {

    @Test
    public void test_observer(){
        Person person = new Person("张三");
        Person person1 = new Person("李四");
        Person person2 = new Person("王五");

        Listener listener = new EventListener();
        listener.registerObserver(person);
        listener.registerObserver(person1);
        listener.registerObserver(person2);

        Subject subject = new Subject(listener);
        subject.sendMsg("官宣");

        //李四取消关注
        listener.removeObserver(person1);
        System.out.println("李四取消关注\n");
        
        subject.sendBlog("博客 - 观察者模式");
    }
}

运行结果:

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值